imacoder 2020-02-23
官方文档的解释如下:
Django 有一个自动执行数据库迁移并同步管理你的数据库结构的命令 - 这个命令是 <span>migrate</span>
,我们马上就会接触它 - 但是首先,让我们看看迁移命令会执行哪些 SQL 语句。<span>sqlmigrate</span>
命令接收一个迁移的名称,然后返回对应的 SQL:
$ python manage.py sqlmigrate polls 0001
你将会看到类似下面这样的输出(我把输出重组成了人类可读的格式):
BEGIN; -- -- Create model Choice -- CREATE TABLE "polls_choice" ( "id" serial NOT NULL PRIMARY KEY, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL ); -- -- Create model Question -- CREATE TABLE "polls_question" ( "id" serial NOT NULL PRIMARY KEY, "question_text" varchar(200) NOT NULL, "pub_date" timestamp with time zone NOT NULL ); -- -- Add field question to choice -- ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL; ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT; CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id"); ALTER TABLE "polls_choice" ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id" FOREIGN KEY ("question_id") REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED; COMMIT;
请注意以下几点:
<span>polls</span>
)和模型名的小写形式( <span>question</span>
和 <span>choice</span>
)连接而来。(如果需要,你可以自定义此行为。)<span>"_id"</span>
。(同样,这也可以自定义。)<span>FOREIGN <span>KEY</span></span>
生成。你不用关心 <span>DEFERRABLE</span>
部分,它只是告诉 PostgreSQL,请在事务全都执行完之后再创建外键关系。<span>auto_increment</span>
(MySQL)、 <span>serial</span>
(PostgreSQL)和 <span>integer <span>primary <span>key <span>autoincrement</span></span></span></span>
(SQLite),Django 会帮你自动处理。那些和引号相关的事情 - 例如,是使用单引号还是双引号 - 也一样会被自动处理。<span>sqlmigrate</span>
命令并没有真正在你的数据库中的执行迁移 - 它只是把命令输出到屏幕上,让你看看 Django 认为需要执行哪些 SQL 语句。这在你想看看 Django 到底准备做什么,或者当你是数据库管理员,需要写脚本来批量处理数据库时会很有用。如果你感兴趣,你也可以试试运行 <span>python <span>manage.py <span>check</span></span></span>
;这个命令帮助你检查项目中的问题,并且在检查过程中不会对数据库进行任何操作。