Django syncdb没有运行自定义SQL

时间:2012-02-05 01:25:16

标签: django django-models

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

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

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

编辑:我想要插入的应用程序是使用南迁移,这可能是为什么跳过初始SQL。有没有人知道如何在迁移后强制它运行SQL?

2 个答案:

答案 0 :(得分:3)

Initial data sql并未针对南方管理的应用程序运行。根据我的理解,这是设计的,虽然我无法找到任何形式的证明,除了mailing list post

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

创建和编辑迁移:

$ 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已损坏:

  1. 对于架构更改,它不能很好地扩展。

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

    否则,如果您不对其进行版本控制并保留最新版本,则之前版本的模型与灯具之间会出现不匹配,您无法来回导航。

  2. 它不支持向后迁移。
  3. 建议的方法解决了这两个问题:

    1. 由于您使用的是orm.Bar,因此您可以在历史记录中拥有适用于Bar的字段集。你不会得到任何遗漏或额外的字段。
    2. 无需通过Bar更改来复制任何内容。
    3. 可以向后迁移。

      请注意,filter().delete()组合用于代替get().delete()。这样您就不会删除用户已更改的Bar,也不会在找不到Bar.DoesNotExist时失败。

答案 1 :(得分:-1)

我不确定你在做什么,但如果你想要预先填充数据库,你需要使用灯具。

https://docs.djangoproject.com/en/1.3/howto/initial-data/