“Django/docs/2.2.x/faq/models”的版本间差异

来自菜鸟教程
Django/docs/2.2.x/faq/models
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:FAQ:数据库和模型 — Django 文档}}
 
<div id="faq-databases-and-models" class="section">
 
<div id="faq-databases-and-models" class="section">
  
第8行: 第9行:
 
== 我该如何在Django运行的过程中看到SQL查询? ==
 
== 我该如何在Django运行的过程中看到SQL查询? ==
  
首先确保你的 Django 设置中的 DEBUG 选项为 <code>True</code>。然后,这样做:
+
确保您的 Django [[#id1|:setting:`DEBUG`]] 设置设置为 <code>True</code>。 然后,只需这样做:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第14行: 第15行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db import connection
+
<syntaxhighlight lang="python">>>> from django.db import connection
&gt;&gt;&gt; connection.queries
+
>>> connection.queries
 
[{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls',
 
[{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls',
'time': '0.002'}]</pre>
+
'time': '0.002'}]</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
<code>connection.queries</code> 只有在 [[../../ref/settings#std-setting-DEBUG|<code>DEBUG</code>]] 为 [[#id1|<span id="id2" class="problematic">``</span>]]True``时才可用. 它是按顺序执行的字典列表,每个字典包括:
+
<code>connection.queries</code> 仅在 [[#id3|:setting:`DEBUG`]] 为 <code>True</code> 时可用。 它是按查询执行顺序排列的字典列表。 每本词典都有以下内容:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第28行: 第29行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>``sql`` -- The raw SQL statement
+
<syntaxhighlight lang="python">``sql`` -- The raw SQL statement
``time`` -- How long the statement took to execute, in seconds.</pre>
+
``time`` -- How long the statement took to execute, in seconds.</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
<code>connection.queries</code> 包含了所有的SQL 语句 -- INSERT, UPDATES, SELECT, 等. 每次你的应用访问了数据库,查询都会被记录下来。
+
<code>connection.queries</code> 包括所有 SQL 语句——插入、更新、选择等。 每次您的应用访问数据库时,都会记录查询。
  
如果你在使用 <span class="xref std std-doc">multiple databases1</span>,你可以对 <code>connections</code> 字典的每个成员使用相同的接口:
+
如果你使用[[../../topics/db/multi-db|多个数据库]],你可以在<code>connections</code>字典的每个成员上使用相同的接口:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第42行: 第43行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db import connections
+
<syntaxhighlight lang="python">>>> from django.db import connections
&gt;&gt;&gt; connections['my_db_alias'].queries</pre>
+
>>> connections['my_db_alias'].queries</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
如果你需要在你的函数中去手动的清空所有的查询点,只需要调用 <code>reset_queries()</code>,像这样:
+
如果您需要在函数中的任何时候手动清除查询列表,只需调用 <code>reset_queries()</code>,如下所示:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第54行: 第55行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.db import reset_queries
+
<syntaxhighlight lang="python">from django.db import reset_queries
reset_queries()</pre>
+
reset_queries()</syntaxhighlight>
  
 
</div>
 
</div>
第66行: 第67行:
 
== 我可以让 Django 用一个之前已经存在的数据库吗? ==
 
== 我可以让 Django 用一个之前已经存在的数据库吗? ==
  
是的,可以看这篇文档 [[../../howto/legacy-databases|<span class="doc">导入已有数据库</span>]]。
+
是的。 请参阅 [[../../howto/legacy-databases|与旧数据库集成]] 。
  
  
第74行: 第75行:
 
== 如果我对一个模型做了改动,我该如何去更新数据库? ==
 
== 如果我对一个模型做了改动,我该如何去更新数据库? ==
  
看看Django对数据模型改动的支持:[[../../topics/migrations#module-django.db|<code>schema migrations</code>]] (模型迁移)
+
看看 Django 对 [[../../topics/migrations#module-django.db|模式迁移]] 的支持。
  
如果你不介意清除数据,工程目录下的 <code>manage.py</code> 工具使用 [[../../ref/django-admin#django-admin-flush|<code>flush</code>]] 选项去立即重置数据库到 执行 [[../../ref/django-admin#django-admin-migrate|<code>migrate</code>]] 后的状态
+
如果您不介意清除数据,您项目的 <code>manage.py</code> 实用程序有一个 [[#id5|:djadmin:`flush`]] 选项可以将数据库重置为 [[#id7|:djadmin 之后的状态:`migrate`]] 已执行。
  
  
第84行: 第85行:
 
== Django 支持多列主键吗? ==
 
== Django 支持多列主键吗? ==
  
不,只支持单列主键。
+
不。 仅支持单列主键。
  
但这在实践中并不是一个问题,因为无法阻止你添加其他的约束(使用 <code>unique_together</code> 模型选项或者在你的数据库中直接创建约束),并强化这一级别的独特性。管理员界面(admin interface)需要单列主键才能工作;例如,你需要一种能够指定要编辑或删除的对象的简单方法。
+
但这在实践中不是问题,因为没有什么可以阻止您添加其他约束(使用 <code>unique_together</code> 模型选项或直接在数据库中创建约束),并在该级别强制执行唯一性。 管理界面等工作需要单列主键; 例如,您需要一种能够指定要编辑或删除的对象的简单方法。
  
  
第94行: 第95行:
 
== Django 支持 NoSQL 数据库吗? ==
 
== Django 支持 NoSQL 数据库吗? ==
  
NoSQL databases are not officially supported by Django itself. There are,
+
Django 本身并不正式支持 NoSQL 数据库。 但是,有许多辅助项目和分支允许在 Django 中使用 NoSQL 功能。
however, a number of side projects and forks which allow NoSQL functionality in
 
Django.
 
  
You can take a look on [https://code.djangoproject.com/wiki/NoSqlSupport the wiki page] which discusses some projects.
+
您可以查看 [https://code.djangoproject.com/wiki/NoSqlSupport 维基页面] ,其中讨论了一些项目。
  
  
第106行: 第105行:
 
== 如何将特定于数据库的选项添加到我的 CREATE TABLE 语句中,例如将 MylSAM 指定为表类型? ==
 
== 如何将特定于数据库的选项添加到我的 CREATE TABLE 语句中,例如将 MylSAM 指定为表类型? ==
  
我们尽量避免在 Django 代码中添加特例来容纳所有特定于数据库的选项,如表数据等。如果您想使用这些选项中的任何一个,请使用:class : ~ django.db.migrations.operations.RunSQL 操作来创建迁移,包含"ALTER TABLE"语句,它们可以执行您想要的操作。
+
我们尽量避免在 Django 代码中添加特殊情况以适应所有特定于数据库的选项,例如表类型等。 如果您想使用这些选项中的任何一个,请使用包含 <code>ALTER TABLE</code> 语句的 [[../../ref/migration-operations#django.db.migrations.operations|RunSQL]] 操作创建迁移,这些语句可以执行您想要执行的操作。
  
例如,如果你使用 MySQL 并且你想让你的数据表使用 MyISAM 表类型,使用如下 SQL 语句:
+
例如,如果您使用 MySQL 并希望您的表使用 MyISAM 表类型,请使用以下 SQL:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第114行: 第113行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>ALTER TABLE myapp_mytable ENGINE=MyISAM;</pre>
+
<syntaxhighlight lang="python">ALTER TABLE myapp_mytable ENGINE=MyISAM;</syntaxhighlight>
  
 
</div>
 
</div>
第123行: 第122行:
  
 
</div>
 
</div>
 +
<div class="clearer">
  
[[Category:Django 2.2.x 中文文档]]
+
 
 +
 
 +
</div>
 +
 
 +
[[Category:Django 2.2.x 文档]]

2021年10月31日 (日) 04:04的最新版本

FAQ:数据库和模型

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

确保您的 Django :setting:`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 仅在 :setting:`DEBUG`True 时可用。 它是按查询执行顺序排列的字典列表。 每本词典都有以下内容:

``sql`` -- The raw SQL statement
``time`` -- How long the statement took to execute, in seconds.

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

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

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

如果您需要在函数中的任何时候手动清除查询列表,只需调用 reset_queries(),如下所示:

from django.db import reset_queries
reset_queries()

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

是的。 请参阅 与旧数据库集成


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

看看 Django 对 模式迁移 的支持。

如果您不介意清除数据,您项目的 manage.py 实用程序有一个 :djadmin:`flush` 选项可以将数据库重置为 :djadmin 之后的状态:`migrate` 已执行。


Django 支持多列主键吗?

不。 仅支持单列主键。

但这在实践中不是问题,因为没有什么可以阻止您添加其他约束(使用 unique_together 模型选项或直接在数据库中创建约束),并在该级别强制执行唯一性。 管理界面等工作需要单列主键; 例如,您需要一种能够指定要编辑或删除的对象的简单方法。


Django 支持 NoSQL 数据库吗?

Django 本身并不正式支持 NoSQL 数据库。 但是,有许多辅助项目和分支允许在 Django 中使用 NoSQL 功能。

您可以查看 维基页面 ,其中讨论了一些项目。


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

我们尽量避免在 Django 代码中添加特殊情况以适应所有特定于数据库的选项,例如表类型等。 如果您想使用这些选项中的任何一个,请使用包含 ALTER TABLE 语句的 RunSQL 操作创建迁移,这些语句可以执行您想要执行的操作。

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

ALTER TABLE myapp_mytable ENGINE=MyISAM;