常见问题:数据库和模型¶
如何查看 Django 正在运行的原始 SQL 查询?¶
请确保你的 Django DEBUG 设置为 True。然后执行以下操作
>>> from django.db import connection
>>> connection.queries
[{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls',
'time': '0.002'}]
只有在 DEBUG 为 True 时,connection.queries 才可用。它是一个按查询执行顺序排列的字典列表。每个字典包含以下内容
sql- 原始 SQL 语句time- 语句执行所需的时间,以秒为单位。
connection.queries 包含所有 SQL 语句——INSERT、UPDATE、SELECT 等。每次你的应用访问数据库时,查询都会被记录下来。
如果你正在使用 多个数据库,你可以在 connections 字典的每个成员上使用相同的接口
>>> from django.db import connections
>>> connections["my_db_alias"].queries
如果你需要在函数中的任何一点手动清除查询列表,请调用 reset_queries(),如下所示
from django.db import reset_queries
reset_queries()
我可以在 Django 中使用现有的数据库吗?¶
可以。请参阅 与遗留数据库集成。
如果我修改了模型,如何更新数据库?¶
请参阅 Django 对 模式迁移(schema migrations) 的支持。
如果你不介意清除数据,项目的 manage.py 工具提供了一个 flush 选项,可以将数据库重置为执行 migrate 之后的状态。
Django 模型支持多列主键吗?¶
不支持。仅支持单列主键。
但这在实践中不成问题,因为没有什么能阻止你添加其他约束(使用 unique_together 模型选项或直接在数据库中创建约束),并在该层面强制执行唯一性。单列主键是管理界面等功能正常工作所必需的;例如,你需要一个唯一的值来指定要编辑或删除的对象。
Django 支持 NoSQL 数据库吗?¶
NoSQL 数据库本身并未得到 Django 的官方支持。然而,有一些第三方项目和分支允许在 Django 中使用 NoSQL 功能。
你可以查看 Wiki 页面,其中讨论了一些相关项目。
如何向 CREATE TABLE 语句添加数据库特定的选项,例如指定 MyISAM 作为表类型?¶
我们尽量避免在 Django 代码中添加特殊情况来适应所有数据库特定的选项(如表类型等)。如果你想使用这些选项中的任何一个,请创建一个迁移,其中包含一个 RunSQL 操作,该操作包含你想要执行的 ALTER TABLE 语句。
例如,如果你正在使用 MySQL 并希望你的表使用 MyISAM 表类型,请使用以下 SQL
ALTER TABLE myapp_mytable ENGINE=MyISAM;