Как создать базу данных 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

Вернуться на верх