【问题标题】:Django syncdb not running custom SQLDjango syncdb 没有运行自定义 SQL
【发布时间】:2012-02-27 02:28:52
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    Initial data sql 不会为 South 管理的应用程序运行。据我了解,这是设计使然,尽管我找不到任何正式的证据,除了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. 不支持向后迁移。

    建议的方法可以解决这两个问题:

    1. 由于您使用orm.Bar,因此您拥有一组适用于Bar 的字段,就在历史的那个时刻。您不会得到任何缺失或额外的字段。
    2. 没有必要继续复制带有Bar 更改的任何内容。
    3. 可以向后迁移。

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

    【讨论】:

    • 感谢您的详细回答。不幸的是,我很久以前就问过这个问题,从那以后就没有使用过 Django,所以我无法验证这是否“正确”。如果有人发现这可以解决问题,请告诉我,以便我准确地将其标记为已回答。
    • 不客气 :) 我发布的代码正是我在生产中使用的代码,只是模型名称发生了变化。希望它会对某人有所帮助。
    【解决方案2】:

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

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

    【讨论】:

    • 看下面:docs.djangoproject.com/en/1.3/howto/initial-data/… 我同意固定装置通常可能是一个更好的主意,因为它们可以与所有数据库一起使用,但是我已经从另一个数据库中获得了我想要的 INSERT 语句,所以 SQL是我想要的。
    • 你的sql文件夹是在你的app文件夹下还是在项目的根目录下?
    • 它在apps//sql 中,所以在我的app 文件夹中。就像我说的,“squall”完美地找到了它。我认为它可能没有运行,因为该特定应用程序使用南迁移。我不知道如何让他们两个一起工作......
    • 通过我的一个项目,看起来我确实经历了将我的 sql 语句转换为 json 的麻烦。但是,我确实发现这可能会对您有所帮助。 stackoverflow.com/questions/2412328/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2013-02-17
    • 2011-10-21
    相关资源
    最近更新 更多