常见问题解答:数据库和模型

如何查看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'}]

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

  • sql -原始SQL语句

  • time -语句执行所用的时间(秒)。

connection.queries 包括所有SQL语句——插入、更新、选择等。每次应用程序访问数据库时,都会记录查询。

如果您正在使用 multiple databases 的每个成员上使用相同的接口。 connections 词典:

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

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

from django.db import reset_queries

reset_queries()

我可以将Django与现有的数据库一起使用吗?

对。见 Integrating with a legacy database .

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

看看Django对 schema migrations .

如果您不介意清除数据,您的项目 manage.py 效用有 flush 选项将数据库重置为它在 migrate 被处决。

Django模型支持多列主键吗?

不支持。只支持单列主键。

但这在实践中并不是问题,因为没有什么可以阻止您添加其他约束(使用 unique_together 或直接在数据库中创建约束),并在该级别强制执行唯一性。单列主键对于诸如管理接口这样的东西是必需的;例如,您需要一个值来指定要编辑或删除的对象。

Django支持NoSQL数据库吗?

Django本身并不支持NoSQL数据库。然而,在Django中有许多副项目和fork允许NoSQL功能。

你可以看看 the wiki page 讨论了一些项目。

如何将特定于数据库的选项添加到create table语句中,例如将myisam指定为表类型?

我们尽量避免在django代码中添加特殊情况,以适应所有特定于数据库的选项,如表类型等。如果要使用这些选项中的任何一个,请使用 RunSQL 包含 ALTER TABLE 做你想做的事的陈述。

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

ALTER TABLE myapp_mytable ENGINE=MyISAM;