首页 > 解决方案 > Django编写数据库迁移转发功能问题

问题描述

我正在尝试将自定义迁移添加到 django 应用程序。我希望自定义迁移不适用于“默认”数据库,而另一个自定义迁移仅适用于“默认”数据库。我应用了 django 文档中建议的方法,但迁移命令从未奏效。我该如何解决这个问题?感谢您的帮助。

Django 文档页面: https ://docs.djangoproject.com/en/2.2/howto/writing-migrations/

我的代码(0001_initial.py,仅适用于“默认”数据库):

from django.db import migrations, models

def forwards(apps, schema_editor):
    if schema_editor.connection.alias == 'default':
        migrations.CreateModel(
                name='Planets',
                fields=[
                    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                    ('name', models.CharField(max_length=255)),
                    ('description', models.TextField(blank=True)),
                ],
            ),



class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.RunPython(forwards),
    ]

其他迁移(仅适用于非“默认”数据库):

from django.db import migrations, models

def forwards(apps, schema_editor):

    if schema_editor.connection.alias != 'default':

        migrations.CreateModel(
            name='data_sources',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('sql_query', models.TextField(default='')),
            ],
        ),
        migrations.CreateModel(
            name='query_history',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('query', models.TextField()),
                ('date', models.DateField(auto_now_add=True)),
            ],
        ),

class Migration(migrations.Migration):

    dependencies = [
        ('universe','0001_initial')
    ]

    operations = [
         migrations.RunPython(forwards),
    ]

标签: pythonsqldjangopython-3.xmigration

解决方案


经过一天的努力,我找到了解决方案。我不再将 Django 迁移系统用于新的动态数据库。而不是这个,我使用 Django SchemaEditor。create_model() 方法可以从任何模型自动创建数据库表。

SchemaEditor:https ://docs.djangoproject.com/en/2.2/ref/schema-editor/

如果要将 SchemaEditor 用于非默认数据库,则必须使用连接模块。例如:

from django.db import connections

with connections['connection_alias'].schema_editor() as schema_editor:

                schema_editor.create_model(any model)

另一方面,如果您不希望 django 从模型创建迁移,则必须在模型中将 managed 设置为 False。例如:

class Objects(models.Model):
    class Meta:
       managed = False

现在,之后

manage.py makemigrations

命令,django 为这个模型创建迁移文件(不用担心),但它永远不会在数据库中为这个模型创建任何表。


推荐阅读