Как создать базу данных mysql в Django при первом запуске?
Я хотел бы, чтобы мое приложение было "plug-and-play", поэтому мне нужно автоматически создавать базу данных при первом запуске. Я использую docker с docker-compose
Моя попытка заключается в подключении без указания имени базы данных и выполнении пользовательской команды перед запуском сервера:
command:
sh -c "python manage.py create_db &&
python manage.py runserver 0.0.0.0:8000"
И сама команда:
class Command(BaseCommand):
"""Django command to create DB"""
def handle(self, *args, **options):
con = connections['default']
db_name = os.environ.get('DB_NAME')
db_up = False
while not db_up:
try:
cursor = con.cursor()
cursor.execute(f'CREATE DATABASE IF NOT EXISTS {db_name}')
cursor.execute(f'USE {db_name}')
db_up = True
except Exception as err:
self.stdout.write('Database unavailable, waiting 1 second...')
self.stdout.write(str(err))
time.sleep(1)
self.stdout.write(self.style.SUCCESS('Database available!'))
Если это правильный путь, то теперь мне просто нужно обновить соединение, чтобы использовать вновь созданную базу данных, но я не знаю как. Строка cursor.execute(f'USE {db_name}'), конечно же, не работает.
Мои вопросы следующие: Правильный ли это способ создания базы данных? Если да, то как обновить соединение? Если нет, то как это сделать?
Спасибо!
Вот как обычно выглядит моя команда управления
call_command()
в основном делает python manage.py {command}
from django.core.management.base import BaseCommand
from django.core.management import call_command
class Command(BaseCommand):
help = 'does thing'
def add_arguments(self, parser):
# Named (optional) arguments
parser.add_argument(
'--import',
action='store_true',
help='Skips Import',
)
def handle(self, *args, **kwargs):
print("Doing Thing")
# create migrations
call_command('makemigrations') # (Django Command)
# can also pass arguemnts like a specific app
# call_command('makemigrations', 'app1')
# This create db **if** it doesn't exist
# + checks that migrations are up to date
call_command('migrate') # (Django Command)
if kwargs['import']:
# another management command to handle importing
# I've just a csv reader and a loop
call_command('importDb') # (Custom Command)
# Collect Static (+ don't ask for confirmation)
call_command('collectstatic', interactive=False) # (Django Command)
print('Thing has been Done')
Итак, я просто запускаю:
python manage.py dothing
(python manage.py dothing --import
если я хочу, чтобы db была импортирована)
и затем:
python manage.py runserver
и все готово!
Редактировать
Просто сделайте что-то вроде этого и извлеките опции из настроек: https://www.w3schools.com/python/python_mysql_create_db.asp