FAQ:数据库和模型

我该如何在Django运行的过程中看到SQL查询?

确保你的 Django 配置中的 DEBUG 设置为 True。然后执行以下操作:

  1. >>> from django.db import connection
  2. >>> connection.queries
  3. [{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls',
  4. 'time': '0.002'}]

只有当 DEBUGTrue 时,connection.queries 才可用。它是按查询执行顺序排列的字典列表。每本词典都有以下内容:

  • sql - 原始 SQL 语句
  • time - 语句执行所用的时间,以秒为单位。

connection.queries 包含了所有的SQL 语句 — INSERT, UPDATES, SELECT, 等. 每次你的应用访问了数据库,查询都会被记录下来。

如果你正在使用 多数据库,则可以在 connections 字典的每个成员上使用相同的接口:

  1. >>> from django.db import connections
  2. >>> connections["my_db_alias"].queries

如果需要在函数中的任何位置手动清除查询列表,只需要调用 reset_queries(),像这样:

  1. from django.db import reset_queries
  2. reset_queries()

我可以让 Django 使用一个已经存在的数据库吗?

是的,可以看这篇文档 导入已有数据库

如果我对一个模型做了改动,我该如何去更新数据库?

看看Django对数据模型改动的支持:schema migrations (模型迁移)

如果你不介意清除数据,工程目录下的 manage.py 工具使用 flush 选项去立即重置数据库到 执行 migrate 后的状态

Django 支持多列主键吗?

不,只支持单列主键。

但这在实践中并不是一个问题,因为无法阻止你添加其他的约束(使用 unique_together 模型选项或者在你的数据库中直接创建约束),并在这一级上强化唯一性。管理界面需要单列主键才能工作;例如,你需要唯一值来指定要编辑或删除的对象。

Django 支持 NoSQL 数据库吗?

Django 官方不支持 NoSQL 数据库,不过有一些项目和拷贝向 Django 中添加了 NoSQL 的功能,如:`Django non-rel`_

你可以查看 the wiki page 来探讨一些其他方案。

如何将特定于数据库的选项添加到我的 CREATE TABLE 语句中,例如将 MylSAM 指定为表类型?

我们尽量避免在 Django 代码中添加特例来容纳所有特定于数据库的选项,如表数据等。如果您想使用这些选项中的任何一个,请使用:class : ~ django.db.migrations.operations.RunSQL 操作来创建迁移,包含"ALTER TABLE"语句,它们可以执行您想要的操作。

例如,如果你正在使用 MySQL 并希望你的表使用 MyISAM 表类型,请使用以下 SQL:

  1. ALTER TABLE myapp_mytable ENGINE=MyISAM;