【问题标题】:In Django, how to create tables from an SQL file when syncdb is run在 Django 中,如何在运行 syncdb 时从 SQL 文件创建表
【发布时间】:2010-04-13 09:32:04
【问题描述】:

如何让 syncdb 执行我定义的 SQL 查询(用于创建表),而不是自动生成表。

我正在寻找此解决方案,因为我的应用程序中的某些特定模型代表旧数据库表的 SQL 表视图。 所以,我在我的 django-DB 中创建了他们的 SQL 视图,如下所示:

CREATE VIEW legacy_series AS SELECT * FROM legacy.series;

我有一个代表上述视图/旧表的逆向工程模型。但是每当我运行syncdb时,我必须首先通过运行sql脚本来创建所有视图,否则syncdb只是为它们创建表(如果没有找到视图)。

如何让syncdb运行上面提到的SQL?

【问题讨论】:

    标签: python mysql django django-models views


    【解决方案1】:

    我知道有 2 种可能的方法可以使您的模型适应旧数据库表(不使用视图):

    1) 在您的项目中运行 python manage.py inspectdb。这将为现有的数据库表生成模型,然后您可以继续使用这些模型。

    2) 使用一些特定设置修改您的表格。首先,通过在元选项中设置 db_table 选项来定义模型中的表名。其次,您通过设置 db_column 选项为每个字段定义与旧数据库匹配的列名。请注意,您可能会使用其他 db_ 选项来匹配您的旧数据库。

    如果您真的希望视图方法可以使用(丑陋的)解决方法,您可以为每个应用程序模型定义custom sql commands。该文件位于 "application"/sql/"model".sql 中。 Django 在创建所有表后将调用此 sql。您可以尝试为生成的表指定 DROP 语句,然后在此文件中创建视图语句。请注意,这对于具有外键的表来说有点棘手,因为 django 保证没有这些文件的执行顺序(因此将所有语句填充到一个 .sql 中将是我认为的最简单的方法,我以前从未尝试过)。

    【讨论】:

      【解决方案2】:

      您可以将unmanaged models 用于您的逆向工程模型,并使用initial SQL scripts 来创建您的视图。

      编辑

      更详细的答案。当您使用非托管模型时,syncdb 不会为您创建数据库表,因此您必须自己处理。很重要的一点是表名,以及django如何将Model类映射到表名,我建议你阅读the doc on that point

      基本上,您的Series 模型看起来像这样:

      class Series(models.Model):
          # model fields...
          ...
      
          class Meta:
              managed = False
              db_table = "legacy_series"
      

      然后,您可以将 SQL 命令放入 yourapp/sql/series.sql 文件中:

      ### yourapp/sql/series.sql
      CREATE VIEW legacy_series AS SELECT * FROM legacy.series;
      

      然后您可以像往常一样syncdb,并开始使用您的旧模型。

      【讨论】:

        猜你喜欢
        • 2011-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多