Вызовите команду Django с фразой в качестве аргумента
Я пытаюсь запустить команду
zappa manage staging 'run_sql --sql \"show databases\"'
Но я получаю следующую ошибку:
zappa manage staging 'run_sql --sql "show databases"'
[START] RequestId: dd895134-dc62-41c3-987b-3ea550af1129 Version: $LATEST
[DEBUG] 2019-03-02T10:51:18.213Z dd895134-dc62-41c3-987b-3ea550af1129 Zappa Event: {'manage': 'run_sql --sql show databases'}
Error: unrecognized arguments: databases: CommandError
Traceback (most recent call last):
File "/var/task/handler.py", line 580, in lambda_handler
return LambdaHandler.lambda_handler(event, context)
File "/var/task/handler.py", line 248, in lambda_handler
return handler.handler(event, context)
File "/var/task/handler.py", line 413, in handler
management.call_command(*event['manage'].split(' '))
File "/var/task/django/core/management/__init__.py", line 127, in call_command
defaults = parser.parse_args(args=parse_args)
File "/var/task/django/core/management/base.py", line 55, in parse_args
return super().parse_args(args, namespace)
File "/var/lang/lib/python3.6/argparse.py", line 1737, in parse_args
self.error(msg % ' '.join(argv))
File "/var/task/django/core/management/base.py", line 61, in error
raise CommandError("Error: %s" % message)
django.core.management.base.CommandError: Error: unrecognized arguments: databases
Я пробовал разные вещи, такие как
zappa manage staging 'run_sql --sql \"show databases\"'
zappa manage staging 'run_sql --sql \\\"show databases\\\"'
zappa manage staging 'run_sql --sql \"show\ databases\"'
zappa manage staging 'run_sql --sql \\\"show\\\ databases\\\"'
Но все терпят неудачу по той же причине:
django.core.management.base.CommandError: Ошибка: нераспознанные аргументы: базы данных \\”
Похоже, что синтаксический анализатор команды Django считает, что фраза - это несколько опций или что-то в этом роде, но я не могу понять, как рассматривать это как один аргумент.
Основано на следующей команде Django:
import MySQLdb as db
from django.conf import settings
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = "Runs a raw SQL query"
def add_arguments(self, parser):
parser.add_argument(
'--user',
dest='user',
help='Username to be used to create database',
)
parser.add_argument(
'--password',
dest='password',
help='Password for the mysql user.',
)
parser.add_argument(
'--db-name',
dest='db_name',
help='Name of the database if it is different from the one defined in settings',
)
parser.add_argument(
'--sql',
dest='sql',
help='SQL query to run',
default='show databases'
)
def handle(self, *args, **options):
self.stdout.write(self.style.SUCCESS('Running raw SQL query'))
sql = options.get('sql')
dbname = options.get('db_name') or settings.DATABASES['default']['NAME']
user = options.get('user') or settings.DATABASES['default']['USER']
password = options.get('password') or settings.DATABASES['default']['PASSWORD']
host = settings.DATABASES['default']['HOST']
self.stdout.write(self.style.SUCCESS(
'Running SQL query\n'
'"{sql}"\n'
'with \n'
'dbname="{dbname}"\n'
'user="{user}"\n'
'password="{password}"\n'
'host="{host}"\n'
''.format(
sql=sql,
dbname=dbname,
user=user,
password=password,
host=host,
)
))
con = db.connect(user=user, host=host, password=password)
cur = con.cursor()
cur.execute(f'{sql}'.format(sql=sql))
output = cur.fetchall()
self.stdout.write(self.style.SUCCESS(
"\nSQL query output:\n"
"{output}".format(output=output))
)
self.stdout.write(self.style.SUCCESS('\n'))
cur.close()
con.close()
self.stdout.write(self.style.SUCCESS('All Done'))