FAQ: データベースとモデル

revision-up-to:17812 (1.4)

Django が実行している生の SQL クエリを見られますか?

まず、 DEBUG 設定を True にして Django を動かしているか確認してく ださい。次に、以下のコードを実行します:

>>> 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`` -- The raw SQL statement
   ``time`` -- How long the statement took to execute, in seconds.

``sql`` -- 生の SQL 文
``time`` -- SQL 文の実行にかかった時間を秒で表したもの

connection.queries には、 INSERT, UPDATE, SELECT といった全ての SQL 文 が記録されています。アプリケーションがデータベースを操作する度に、クエリが 記録されてゆきます。ここで記録されている SQL は SQLite 上では正しく ないクオート処理 がされているかもしれないことに 注意してください。

リリースノートを参照してください

もし 複数のデータベース を使用している場合は、 connections 辞書内の各エイリアスに対し、同じコードを実行できます:

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

既存のデータベースで Django を使えますか?

使えます。 古いデータベースの組み込み方 を 参照してください。

モデルを変更したとき、どうやってデータベースを更新すればよいですか?

データが消えてもかまわないのなら、 manage.py ユーティリティを使って、特 定のアプリケーションをリセットする SQL を発行してください:

manage.py reset appname

この操作で、 appname に関係したテーブルが削除され、再度作成されます。

もしデータを削除したくないのなら、手作業で ALTER TABLE 文を実行せねば なりません。

スキーマのアップデートを扱う外部プロジェクト のデファクトスタンダードは south です。

Django のモデルは複数カラムにわたる主キーをサポートしていますか?

いいえ。サポートしているのは単カラムの主キーだけです。

しかし、実際には問題はありません。というのも、(unique_together モデルオ プションを指定したり、直接データベースに制約をかけたりして) 複数カラムにわ たる一意性が保たれるようモデルレベルで制約をかけられるからです。単カラムの 主キーは admin インタフェースをうまく稼働させるため、例えば編集や削除対象の オブジェクトを指定する簡潔な手段として必要であるにすぎません。

テーブル形式を MyISAM に指定するなど、データベース固有のオプションを CREATE TABLE 文に追加したいのですが、どうすればよいですか?

私達は、テーブルの形式のようなデータベース固有のオプションに対応するために Django のコードに特殊なケースを追加しないよう心がけています。データベース固 有のオプションを使いたければ、 SQL の初期データファイル を作成して、その中で ALTER TABLE 文を使うなどして自分の目的を実現してください。初期データ ファイルはデータベースの中で CREATE TABLE 文の後に実行されます。

例えば、 MySQL を使っていて、 MyISAM テーブルタイプを使いたい場合には、初期 データファイルを作成して、以下のような行を挿入します:

ALTER TABLE myapp_mytable ENGINE=MyISAM;

SQL の初期データファイル <initial-sql> でも説明していますが、 SQL ファイ ルには任意の SQL コードを入れられるので、SQL で行なえる変更なら何でも実現で きます。

Django がメモリリークを起こしているのですが、なぜですか?

Django に既知のメモリリークはありません。 Django プロセスがメモリをどんどん 消費して、一向に開放する気配がない場合、 DEBUGTrue にな っていないか調べてみてください。 DEBUGTrue にすると、 Django は実行した SQL 文の全てのコピーを保存するからです。

(クエリは django.db.connection.queries で保存されます。 Django が実行している生の SQL クエリを見られますか? を参照してください。)

問題を解決するには、 DEBUGFalse にしてください。

クエリリストを手動で消去するには、以下のように reset_queries() を呼び出 してください:

from django import db
db.reset_queries()