gpt4 book ai didi

Django syncdb 未运行自定义 SQL

转载 作者:行者123 更新时间:2023-12-04 08:50:12 27 4
gpt4 key购买 nike

我试图让我的应用程序在 syncdb 上运行一些自定义 SQL,官方方法是将一些 INSERT 语句放入/sql/.sql

现在,当我运行“manage.py sqlall”时,我想要运行的所有 SQL 都在那里。

但是,运行syncdb后,我想要的数据在数据库中找不到了!我错过了什么吗?

编辑:我想要插入的应用程序正在使用南迁移,这可能是跳过初始 SQL 的原因。有谁知道我可以如何强制它在迁移后运行 SQL,也许?

最佳答案

Initial data sql不会为南方管理的应用程序运行。据我所知,这是设计使然,尽管我找不到任何正式的证据,除了这个 mailing list post .

要实现相同的行为,您可以创建迁移并将 SQL 转换为 Python。这是我安装 View 的方式:

创建和编辑迁移:

$ python manage.py schemamigration app1 install_foo_view --empty
$ vim app1/migrations/*_install_foo_view.py

这是迁移本身:
from south.db import db
from south.v2 import SchemaMigration

class Migration(SchemaMigration):

def forwards(self, orm):
db.execute("CREATE VIEW app1_foo AS SELECT col1, col2 FROM app1_bar")

def backwards(self, orm):
db.execute("DROP VIEW app1_foo")

# autogenerated models attibute goes here

complete_apps = ['app1']

对于数据迁移,流程类似:
$ python manage.py datamigration app1 install_bars
$ vim app1/migrations/*_install_bars.py

这是迁移本身:
from south.db import db
from south.v2 import DataMigration

class Migration(DataMigration):

def forwards(self, orm):
orm.Bar.objects.create(col1='val1', col2='val2')

def backwards(self, orm):
orm.Bar.objects.filter(col1='val1', col2='val2').delete()

# autogenerated models attibute goes here

complete_apps = ['app1']

official South doc数据装置坏了:
  • 它在架构更改方面不能很好地扩展。

    每次更改Bar 时都应该复制并调整夹具文件。模型字段。所以你最终会得到“my_fixture_v1.json”、“my_fixture_v2.json”等等。

    否则,如果您不继续对它们进行版本控制而只保留最新版本,则模型的先前版本和装置之间将不匹配,并且您将无法来回导航迁移。
  • 它不支持向后迁移。

  • 建议的方法可以解决这两个问题:
  • 由于您使用 orm.Bar您拥有适用于 Bar 的一组字段就在历史的那个时刻。您不会得到任何缺失或额外的字段。
  • 无需继续使用 Bar 复制任何内容变化。
  • 向后迁移是可能的。

    请注意 filter().delete()使用组合代替 get().delete() .这样你就不会删除 Bar s 已被用户更改,您也不会失败 Bar.DoesNotExist找不到他们的时候。
  • 关于Django syncdb 未运行自定义 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146142/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com