Django在代码更改后获取syncdb sqlall语句进行更新

时间:2013-06-09 23:58:46

标签: django syncdb

尝试查看syncdb将在当前时刻生成的SQL。

经过多次搜索,答案并不明显 - 我知道你可以使用:

python manage.py syncdb --sqlall

返回:

Create the database tables for all apps in INSTALLED_APPS whose tables haven't already been created.

如果代码发生了任何变化,如何输出整个数据库发生的变化?

有没有办法为所有需要syncdb'ing的应用生成所有SQL?或者我需要明确说明每个应用程序?我不是在寻找整个站点的所有SQL,只是针对syncdb实现的更改。

我有几个需要sql生成的应用来描述这些变化。我可以明确地列出它们,但syncdb有没有办法为我解决这个问题?

2 个答案:

答案 0 :(得分:6)

你可以做到

./manage.py sqlall <app_name>

获取sql statements and initial data for the app.

如果您只想要sql statements

./manage.py sql <app_name>

这是一个mangement command,可以为所有已安装的应用打印sqlall。 或者,您可以编写自己的管理命令来获取所有已安装的应用程序,并为每个应用程序调用{​​{1}}。

答案 1 :(得分:1)

Django Extensions包有许多django的自定义管理命令,其中一个命令是sqldiff:

https://github.com/django-extensions/django-extensions/blob/master/docs/sqldiff.rst

首先,

sudo pip install django-extensions

接下来,将django-extensions添加到已安装的应用

INSTALLED_APPS = (
    ...
    'django_extensions',
    ...
)

然后,你可以

python manage.py sqldiff -a

您将看到完整的差异列表,以及一长串ALTER TABLE语句,这些语句将确保正确设置所有字段(长度,空值,无符号等)

将列出任何未创建的表,然后您可以转储SQL以使用

创建它们
python manage.py sqlall {app_label}

值得注意的是,对于列名更改,sqldiff将尝试简单地删除重命名的列并在其位置创建新列 - 所以不要只复制整个sqldiff并且在没有检查的情况下运行它。