【问题标题】:Is there a way to specify the order of creation of the columns for an SQL table conception using Django?有没有办法使用 Django 为 SQL 表概念指定列的创建顺序?
【发布时间】:2016-04-26 13:01:20
【问题描述】:

我目前正在使用 Django 模型复制旧的 postgresql 数据库。数据库的第一个版本有一些脚本来计算数据以填充表格。

我要在表格中插入的数据被格式化为 TSV 文件:value1\tvalue2\value3。接下来将使用 SQL 命令\copy my_table from 'path/to/my/file.tsv' with null as 'NULL' 插入它们。

因为脚本定义了 TSV 文件中数据的顺序,所以我的字段必须在表中以相同的顺序创建。问题是 Django 似乎将外键设置为表的末尾。

此模型示例:

class My_table(models.Model):
    field1 = models.CharField(primary_key=True, max_length=25)
    field2 = models.ForeignKey(....)
    field3 = models.IntegerField(blank=True, null=True)
    field4 = models.CharField(max_length=2000, blank=True, null=True)

可以给出如下表格:

  field1 | field3 | field4 | field2  
 --------+--------+--------+--------

我想要这个:

  field1 | field2 | field3 | field4  
 --------+--------+--------+--------

有没有办法得到这个结果?

【问题讨论】:

    标签: python sql django postgresql django-models


    【解决方案1】:

    如果您使用内置的 Django 迁移,您实际上可以重新排序迁移文件中定义的 fields 以更改在数据库中创建列的顺序。

    你应该有类似的东西:

    # 0001_initial.py
    class Migration(migrations.Migration):
        ....
        operations = [
            migrations.CreateModel(
    
                # the fields here can be re-ordered
                fields=[
                    ('id', ...),
                    ('field1', ....),
                    ('field2', ....),
                    ('field3', ....),
                    ('field4', ....),
                ]
            )
        ]
    

    您可以使用python manage.py sqlmigrate appname 0001 打印出将要执行的SQL:

    CREATE TABLE "my_table" ("id", ....);
    

    请注意,无论字段顺序如何,Django 都会强制“id”成为表中定义的第一列。

    【讨论】:

    • 我必须手动修改django的迁移结果?如果我必须编写脚本来执行此中间操作,这是一个复杂的解决方案。如果我必须重新部署数据库模型,那么第一次迁移期间的新步骤似乎很困难......在模块设置或模型参数中我错过了什么?
    • 在我对 Django 1.9.1 的测试中,定义字段的顺序与我的数据库中的列顺序相同。什么版本的 Django,你用的是什么数据库?
    • 我目前正在使用 Django 1.9.0 和 Postgresql 9.3.9 和 python 3.4.3
    • 老实说,我会手动修改初始迁移。如果您重新部署,无论如何您都不会生成新的迁移(您将重新使用您修改的迁移)。如果您有数百个表,那么您可以考虑使用旧数据库为新数据库生成架构,并使用 --fake-initial 参数运行迁移。
    • 我的例子不是真正的代码,它只是我看到的。我刚刚观察到,在我的情况下,问题只发生在外键上(如果它们也没有用作主键)。它们被移到表格的末尾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多