在Django中,如何在运行syncdb时从SQL文件创建表格
我想知道怎么让syncdb执行我自己定义的SQL查询(用于创建表),而不是自动生成表。
我需要这个解决方案,因为我应用中的某些模型代表的是一个旧数据库表的SQL视图。
所以,我在我的django数据库中这样创建了它们的SQL视图:
CREATE VIEW legacy_series AS SELECT * FROM legacy.series;
我有一个反向工程的模型,表示上面的视图/旧表。但是每次我运行syncdb时,我都必须先通过运行SQL脚本来创建所有视图,否则syncdb会直接为它们创建表(如果找不到视图的话)。
我该怎么做才能让syncdb运行上面提到的SQL呢?
2 个回答
你可以使用非管理模型来处理你反向工程出来的模型,同时可以用初始SQL脚本来创建你的视图。
编辑:
这里有个更详细的解释。当你使用非管理模型时,syncdb
不会为你创建数据库表,所以你需要自己来处理这个问题。一个重要的点是表的名字,以及Django是如何将Model
类映射到表名的,我建议你看看这部分文档。
基本上,你的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
,开始使用你的旧模型。
我知道有两种方法可以让你的模型适应旧版数据库表(不使用视图的情况下):
1) 在你的项目中运行 python manage.py inspectdb。这条命令会为现有的数据库表生成模型,然后你就可以继续使用这些模型了。
2) 修改你的表,设置一些特定的选项。首先,你可以在模型中通过设置 db_table 选项来定义表的名称。其次,你需要为每个字段定义与旧版数据库匹配的列名,这可以通过设置 db_column 选项来实现。需要注意的是,还有其他一些 db_ 选项可以用来帮助你匹配旧版数据库。
如果你真的想使用视图的方法,有一种(不太好)的方法可以实现,你可以为每个应用模型定义 自定义 SQL 命令。这个文件位于 "应用"/sql/"模型".sql 中。Django 会在创建所有表后调用这些 SQL。你可以尝试在这个文件中指定 DROP 语句来删除生成的表,然后再写上你的视图创建语句。需要注意的是,对于有外键的表,这个过程会有点棘手,因为 Django 不保证这些文件的执行顺序(所以把所有语句放在一个 .sql 文件里可能是最简单的方法,我之前没有尝试过)。