Django 查看操作数据库的执行命令

用户头像
Young先生
关注
发布于: 2020 年 08 月 13 日
Django查看操作数据库的执行命令

背景:

因为一些原因,实际环境中,mysql账户不能拥有创建、删除表的权限。需要通过数据库操作平台来新建表。

担心自己写的建表语句创建出来的表跟Django的makemigrationsmigrate创建的有差别,就想查看一下migrate操作数据库的建表语句。



结果

Django官方文档有写,我这就复制粘贴一下。官方文档:https://docs.djangoproject.com/zh-hans/2.2/intro/tutorial02/



sqlmigrate 命令接收一个迁移的名称,然后返回对应的 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;

请注意以下几点:

  • 输出的内容和你使用的数据库有关,上面的输出示例使用的是 PostgreSQL。

  • 数据库的表名是由应用名(polls)和模型名的小写形式( question 和 choice)连接而来。(如果需要,你可以自定义此行为。)

  • 主键(IDs)会被自动创建。(当然,你也可以自定义。)

  • 默认的,Django 会在外键字段名后追加字符串 "_id" 。(同样,这也可以自定义。)

  • 外键关系由 FOREIGN KEY 生成。你不用关心 DEFERRABLE 部分,它只是告诉 PostgreSQL,请在事务全都执行完之后再创建外键关系。

  • 生成的 SQL 语句是为你所用的数据库定制的,所以那些和数据库有关的字段类型,比如 auto_increment (MySQL)、 serial (PostgreSQL)和 integer primary key autoincrement (SQLite),Django 会帮你自动处理。那些和引号相关的事情 - 例如,是使用单引号还是双引号 - 也一样会被自动处理。

  • 这个 sqlmigrate 命令并没有真正在你的数据库中的执行迁移 - 它只是把命令输出到屏幕上,让你看看 Django 认为需要执行哪些 SQL 语句。这在你想看看 Django 到底准备做什么,或者当你是数据库管理员,需要写脚本来批量处理数据库时会很有用。



如果你感兴趣,你也可以试试运行 python manage.py check ;这个命令帮助你检查项目中的问题,并且在检查过程中不会对数据库进行任何操作。



本文首发于BigYoung小站(http://www.bigyoung.cn)

发布于: 2020 年 08 月 13 日 阅读数: 37
用户头像

Young先生

关注

Python工程师/书虫/极客/ 2020.04.22 加入

伸手摘星,即使徒劳无功,也不至于满手泥污。 欢迎大家访问我的BigYoung小站(bigyoung.cn)

评论

发布
暂无评论
Django查看操作数据库的执行命令