带有 2 个数据库的 Django 迁移?

     2023-02-24     81

关键词:

【中文标题】带有 2 个数据库的 Django 迁移?【英文标题】:Django migration with 2 DBs? 【发布时间】:2021-08-30 13:29:00 【问题描述】:

我有数据库db1db2。应该使用相同的迁移脚本创建两个 DB 的模式。

Django 文档提到了DATABASE_ROUTERS 和RunPython,但到目前为止我还没有设法让它工作。函数被调用,但migrations.CreateModel()从函数调用时没有影响:没有创建表。

迁移脚本:

# 0001_initial.py

def forwards(apps, schema_editor):
    if schema_editor.connection.alias == 'db1':
        print('This line is called!')
        migrations.CreateModel(
            name='MyModel',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                # ...
            ]
        )

class Migration(migrations.Migration):
    initial = True
    
    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.RunPython(forwards, hints='target_db': 'db1'),
    ]

路由器:

DatabaseRouter:
    # ...
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if 'target_db' in hints:
            return db == hints['target_db']
        return True

命令:

python manage.py migrate --database=db1

有什么想法吗?提前致谢!

【问题讨论】:

你为什么不把migrations.CreateModel写在operations列表中呢?实际上,您为什么还要编写迁移以手动制作模型?只需在models.py 中编写模型的代码并运行makemigrations,您将自动获得一个迁移文件... @AbdulAzizBarkat 我需要在某处定义在哪个数据库中创建的模型不是由makemigrations 完成的。你会怎么做? 那当然是在 router 中的allow_migrate 方法中完成的。您将检查传递的app_label 和数据库别名db 并返回True 以防它应该迁移到那里,False 如果不是,None 如果其他路由器应该决定。 感谢您的提示。你有我可以使用和接受的有效答案吗? 【参考方案1】:

migrations.CreateModel 在实例化时不会在数据库中创建模型。它应该出现在operations 列表中,然后迁移系统将使用它来创建模型。此外,无论如何您都不应该手动编写此迁移!只需在models.py中编写模型的代码:

class MyModel(models.Model):
    # Your fields, etc.

接下来,因为您的问题询问如何控制将哪个模型迁移到哪个数据库。这些任务应该在Database router 中完成,尤其是在allow_migrate 方法中。您可以检查为dbapp_labelmodel_name 传递的值,返回是否应将模型迁移到那里。例如:

class MyRouter:
    def db_for_read(self, model, **hints):
        ...

    def db_for_write(self, model, **hints):
        ...

    def allow_relation(self, obj1, obj2, **hints):
        ...

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # Suppose I want to migrate all models from the app 'some_app' to 'db1' only.
        if app_label in ['some_app']:
            return db == 'db1'
        # Suppose I want to migrate 'MyModel' to 'db2' only.
        if model_name == 'mymodel':  # 'mymodel' is lowercase 'MyModel'
            return db == 'db2'
        return None

【讨论】:

非常感谢。这正是我想要的。

带有 Django 1.7 迁移的 Python 2.7 未绑定方法

】带有Django1.7迁移的Python2.7未绑定方法【英文标题】:Python2.7unboundmethodwithDjango1.7migrations【发布时间】:2015-09-2118:46:44【问题描述】:我正在升级到Django1.7.4并使用新的内置迁移,但在尝试运行makemigrations时出现以下错误:ValueErr... 查看详情

带有架构的 MSSQL 数据库的 Django 迁移错误

】带有架构的MSSQL数据库的Django迁移错误【英文标题】:DjangoMigrationErrorWithMSSQLDatabaseWithSchemas【发布时间】:2021-01-2315:34:00【问题描述】:我刚刚开始为Django后端创建设置(全部在Python中)。我使用MSSQL并在Linux中运行我的django以... 查看详情

带有转储数据和迁移的 Django 备份策略

...2016-04-2116:36:58【问题描述】:与thisquestion一样,我为我的数据库设置了一个基于dumpdata的备份系统。该设置类似于运行一个调用dumpdata并将备份移动到远程服务器的cron脚本,目的是简单地使用loaddata来恢复数据库。但是,我是not 查看详情

如何在不同的数据库中使用带有外键的 django 模型?

】如何在不同的数据库中使用带有外键的django模型?【英文标题】:HowtousedjangomodelswithforeignkeysindifferentDBs?【发布时间】:2011-10-1310:04:44【问题描述】:我有2个模型用于2个不同的数据库:数据库是手动创建的,但它应该没有任... 查看详情

Django : HTML 表单操作指向带有 2 个参数的视图(或 url?)

】Django:HTML表单操作指向带有2个参数的视图(或url?)【英文标题】:Django:HTMLformactiondirectingtoview(orurl?)with2arguments【发布时间】:2017-07-1510:08:34【问题描述】:大约一周前开始学习django,结果碰壁了。真的很感激任何启示......mo... 查看详情

Django:迁移错误中的加载数据

】Django:迁移错误中的加载数据【英文标题】:Django:loaddatainmigrationserrors【发布时间】:2015-12-3022:56:19【问题描述】:自从使用Django迁移(不是南)并使用loaddata作为其中的固定装置以来,我发生了一些非常烦人的事情。这是重... 查看详情

django迁移问题

...判断哪些迁移脚本需要执行:他会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。面试题2:migrate做了什么事情:将相关的迁移脚本翻... 查看详情

django迁移脚本

...了什么事情?1.将相关的迁移脚本翻译成sql语句,然后在数据库中执行2.如果sql语句执行没有问题,那么会将相关的迁移脚本的名字记录到数据库中django_migrations表中migrate怎么判断哪些迁移脚本需要执行?migrate会将代码中的迁移... 查看详情

第二个模型的 Django 迁移

】第二个模型的Django迁移【英文标题】:Djangomigrationsforsecondmodel【发布时间】:2019-11-2908:01:35【问题描述】:Django不响应迁移到新应用中的模型。我删除了应用程序,然后创建了一个新应用程序,但仍然没有响应。我删除了旧的... 查看详情

我的旧项目出现 Django 1.7 迁移问题

...1.5应用程序,现在我将它迁移到django1.7并且应用程序在旧数据库上运行良好。但现在我想使用django1.7为该应用创建迁移。我删除了旧的迁移,只保留了带有__init__文件的迁移文件夹然后我跑了./manag 查看详情

Django - 无法进行迁移,MySQL 5.7.19,Py 3.6.2 [重复]

...MacOS10.12.6)上建立一个测试站点。我的Python版本是3.6.2,带有 查看详情

如果 AddField 引用“相同”列,则带有“--fake-initial”的 Django 迁移不起作用

】如果AddField引用“相同”列,则带有“--fake-initial”的Django迁移不起作用【英文标题】:Djangomigrationwith"--fake-initial"isnotworkingifAddFieldreferesto"same"column【发布时间】:2019-03-0522:50:38【问题描述】:我正在玩django(我... 查看详情

在 Django 中将 SQLite3 数据库迁移到 MySQL

】在Django中将SQLite3数据库迁移到MySQL【英文标题】:MigrateSQLite3databasetoMySQLinDjango【发布时间】:2018-10-1112:37:09【问题描述】:我正在使用Django1.11和带有python3的Django-CMS开发一个网站。最初我使用默认数据库sqlite3,但是,现在我... 查看详情

Django迁移错误表已经存在

...所有createtable(sql)djangomakemigrations,例如5个表[1,2,3,4,5]我的数据库中已经有first( 查看详情

如何将现有 CharField 与数据迁移到 Django 中的 IntegerField

...间】:2016-09-0512:09:58【问题描述】:我的models.py中有一些带有CharFields的模型。例如classMyModel(models.Model):item_port=models.Cha 查看详情

通过 Django 模型迁移覆盖表的风险?

...运行“makemigrations”之后,控制台输出让我担心我会覆盖数据库中的其他表。基本上,在我的models.py中,我有8个模型。一个是全新的,一个只是修改过的 查看详情

带有加载夹具的 Django 单元测试,用于解决几个相关的应用程序问题

...进行单元测试。我面临下一个问题:在运行syncdb创建测试数据库后,Django会自动填充几个表,例如django_ 查看详情

如何对 Django South“数据迁移”进行单元测试

】如何对DjangoSouth“数据迁移”进行单元测试【英文标题】:HowtounittestaDjangoSouth"datamigration"【发布时间】:2011-06-1507:48:40【问题描述】:我使用south创建了一个数据迁移,它采用版本表并将其转换为:major:1,minor:2,micro:3,rel... 查看详情