gpt4 book ai didi

python - Django:在每次启动时运行代码,但在迁移数据库之后

转载 作者:太空狗 更新时间:2023-10-29 19:27:14 25 4
gpt4 key购买 nike

我认为在最新版本的 Django 中对此有一个简单的答案,但我找不到。

我有接触数据库的代码。我希望它在每次 Django 启动时运行。我似乎有两个选择:

选项 1. AppConfig.ready() - 这有效,但也在创建数据库表之前运行(即在测试期间或在没有数据的情况下重新初始化应用程序时)。如果我使用它,我必须捕获多种类型的异常并猜测原因是一个空数据库:

def is_db_init_error(e, table_name):
return ("{}' doesn't exist".format(table_name) in str(e) or
"no such table: {}".format(table_name) in str(e)
)

try:
# doing stuff
except Exception as e:
if not is_db_init_error(e, 'foo'):
raise
else:
logger.warn("Skipping updating Foo object as db table doesn't exist")

选项 2。使用 post_migrate.connect(foo_init, sender=self) - 但这仅在我执行迁移时运行。

选项 3. 旧方法 - 从 urls.py 调用它 - 我想将这样的东西保留在 urls.py 之外我认为 AppConfig 是一条真正的道路

到目前为止,我已经选择了选项 2 - 我不喜欢选项 1 中那些臭烘烘的 try/except 内容,而选项 3 让我感到厌烦,因为 urls.py 变成了垃圾场。

但是,当我在本地进行开发时,选项 2 经常让我感到困惑——我需要记住在我希望初始化代码运行时运行迁移。像拉下生产数据库或类似的东西通常会导致问题,因为没有触发迁移。

最佳答案

我会建议 connection_created信号,即:

Sent when the database wrapper makes the initial connection to the database. This is particularly useful if you’d like to send any post connection commands to the SQL backend.

因此,当应用程序在应用程序周期开始时连接到数据库时,它将执行信号的代码。

它也可以在多数据库配置中工作,甚至可以在初始化时分离应用程序建立的连接:

connection
The database connection that was opened. This can be used in a multiple-database configuration to differentiate connection signals from different databases.


注意:
您可能需要考虑使用 post_migrate 的组合和 connection_created 信号同时检查你的 AppConfig.ready() 是否发生了迁移(例如标记 post_migrate 信号的激活):

from django.apps import AppConfig
from django.db.models.signals import post_migrate, connection_created
# OR for Django 2.0+
# django.db.backends.signals import post_migrate, connection_created

migration_happened = false

def post_migration_callback(sender, **kwargs):
...
migration_happened = true


def init_my_app(sender, connection):
...


class MyAppConfig(AppConfig):
...

def ready(self):
post_migrate.connect(post_migration_callback, sender=self)

if !migration_happened:
connection_created.connect(init_my_app, sender=self)

关于python - Django:在每次启动时运行代码,但在迁移数据库之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43393915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com