【发布时间】:2022-10-16 10:43:40
【问题描述】:
我希望我的应用程序是“即插即用”的,所以我需要在第一次运行时自动创建数据库。我使用 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}') 行当然不起作用。
它是创建数据库的正确方法吗? 如果是这样,如何更新连接? 如果没有,怎么办?
谢谢!
编辑
在 Nealium 的提示之后,我创建了一个独立的脚本(不是 Django 命令),我在运行服务器之前运行它。
import os
import time
from MySQLdb import _mysql
import os
db_host=os.environ.get('DB_HOST')
db_user=os.environ.get('DB_USER')
db_password=os.environ.get('DB_PASS')
db_name = os.environ.get('DB_NAME')
db_up = False
while not db_up:
try:
db = _mysql.connect(
host=db_host,
user=db_user,
password=db_password
)
db_up = True
db.query(f'CREATE DATABASE IF NOT EXISTS {db_name}')
db.close()
except Exception as err:
print('Database unavailable, waiting 1 second...')
time.sleep(1)
print('Database available!')
【问题讨论】:
-
我只有一个管理命令
dothing(用python manage.py dothing调用)运行call_command('makemigrations', 'app1')+call_command('migrate')之类的命令,它创建一个空数据库,然后它执行一个导入命令来填充数据库 -
你能写更多细节,也许是一个例子?我对 Django 比较陌生。