【问题标题】:Django Writing database migrations forward function issueDjango编写数据库迁移转发功能问题
【发布时间】:2019-10-27 20:14:29
【问题描述】:

我正在尝试将自定义迁移添加到 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),
    ]

【问题讨论】:

    标签: python sql django python-3.x migration


    【解决方案1】:

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

    架构编辑器: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 迁移

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

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2018-03-04
      • 2011-07-14
      • 1970-01-01
      相关资源
      最近更新 更多