django最佳实践之数据迁移执行migrate后自动初始化数据

django数据迁移执行migrate后自动插入初始化数据之官方版本

本文档参考django.contrib.sites中相关实践

1.直接上结论

设置sql执行方法->利用信号post_migrate自动执行

2.具体实现

完整代码请自行查看django.contrib.sites相关代码

2.1 django.contrib.sites.management 中实现sql生成和执行方法create_default_site
"""
Creates the default Site object.
"""

from django.apps import apps as global_apps
from django.conf import settings
from django.core.management.color import no_style
from django.db import DEFAULT_DB_ALIAS, connections, router


def create_default_site(app_config, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, apps=global_apps, **kwargs):
    try:
        Site = apps.get_model('sites', 'Site')
    except LookupError:
        return

    if not router.allow_migrate_model(using, Site):
        return

    if not Site.objects.using(using).exists():
        # The default settings set SITE_ID = 1, and some tests in Django's test
        # suite rely on this value. However, if database sequences are reused
        # (e.g. in the test suite after flush/syncdb), it isn't guaranteed that
        # the next id will be 1, so we coerce it. See #15573 and #16353. This
        # can also crop up outside of tests - see #15346.
        if verbosity >= 2:
            print("Creating example.com Site object")
        Site(pk=getattr(settings, 'SITE_ID', 1), domain="example.com", name="example.com").save(using=using)

        # We set an explicit pk instead of relying on auto-incrementation,
        # so we need to reset the database sequence. See #17415.
        sequence_sql = connections[using].ops.sequence_reset_sql(no_style(), [Site])
        if sequence_sql:
            if verbosity >= 2:
                print("Resetting sequence")
            with connections[using].cursor() as cursor:
                for command in sequence_sql:
                    cursor.execute(command)

2.2 django.contrib.sites.apps 使用post_migrate信号
from django.apps import AppConfig
from django.db.models.signals import post_migrate
from django.utils.translation import gettext_lazy as _

from .management import create_default_site


class SitesConfig(AppConfig):
    name = 'django.contrib.sites'
    verbose_name = _("Sites")

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

### Django 数据迁移教程 #### 创建并应用数据迁移Django中,数据迁移指的是将应用程序的数据库模式更改应用到实际使用数据库的过程。每当修改了`models.py`文件中的模型定义之后,都需要创建新的迁移文件并将这些变更同步至数据库。 为了实现这一点,通常会按照如下方式操作: ```bash python manage.py makemigrations ``` 此命令用于检测自上次迁移以来对模型所做的任何改动,并据此生成一个新的迁移脚本[^4]。 接着执行下面这条指令来把上述变化真正落实到目标数据库里去: ```bash python manage.py migrate ``` 这一步骤将会读取之前由`makemigrations`所生产的SQL语句,并将其提交给对应的RDBMS以完成最终的数据结构调整工作[^5]。 #### 解决数据迁移过程中可能遇到的问题 有时,在尝试运行以上两个核心命令时可能会碰到各种错误提示。对于这类情况的发生频率较高的场景之一就是由于旧有的迁移记录存在问题而导致的新建迁移无法正常运作。此时可以考虑采取清理措施——即删除特定应用目录下的所有`.pyc`以及非初始化(`__init__.py`)的历史迁移文档;这样做能够强制让系统忘记过去的失败状态从而允许我们干净利落地重置整个流程[^2]。 另外值得注意的是,如果项目涉及到了多数据库的支持,则要特别留意确保各个关联对象被正确分配给了预期的目标存储位置,以免造成不必要的混乱局面[^3]。 最后提醒一点关于外键约束方面的事情:当存在跨表关系的时候,请务必确认相关联双方都处于兼容的状态之下再实施变动动作,否则很容易引发连锁反应式的异常状况发生。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值