Django South -从Python代码迁移

1szpjjfi  于 2023-01-12  发布在  Python
关注(0)|答案(2)|浏览(83)

可以从Python代码运行迁移吗?我不想(实际上我不能)使用terminal命令:

venv/bin/python src/manage.py migrate myapp

我需要在动态创建的数据库上从Python代码运行它,作为业务逻辑的一部分。
这是我目前掌握的情况:

db_name = uuid.uuid4()
from settings.local import DATABASES
new_database = {}
new_database['ENGINE'] = 'django.db.backends.mysql'
new_database['NAME'] = db_name
new_database['USER'] = DATABASES["default"]["USER"]
new_database['PASSWORD'] = DATABASES["default"]["PASSWORD"]
new_database['HOST'] = DATABASES["default"]["HOST"]
new_database['PORT'] = DATABASES["default"]["PORT"]
import settings
database_id = str(uuid.uuid4())
settings.DATABASES[database_id] = new_database
from django.core.management import call_command
call_command('migrate', 'catalogue', database=database_id)

但我得到:

KeyError: '28a4eb10-91e4-4de8-8a74-15d72f8245ef'
vyu0f0g1

vyu0f0g11#

是的,你可以。假设它是从Django应用中调用的:

from django.core.management import call_command

call_command('migrate', 'myapp')
wgx48brx

wgx48brx2#

我相信你遇到的问题是你在运行时配置新的数据库。所以,你在运行时改变的配置是在你用代码点击的进程/线程上。设置dict是不可变的,你不能在运行时改变它(见django文档)。
我不确定,但很可能call_command使用的设置dict是从设置配置加载的原始dict的副本,这就是为什么您会得到关键错误(那里没有新的配置)。
顺便说一下,django社区不推荐在运行时更改设置配置。

相关问题