revision-up-to: | 17812 (1.4) |
---|
まず、 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
を使えるのは DEBUG
が True
の時だけです。
この値は、クエリの実行順に辞書を並べたものです。各辞書には以下の値が入ってい
ます:
.. ``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
使えます。 古いデータベースの組み込み方 を 参照してください。
データが消えてもかまわないのなら、 manage.py
ユーティリティを使って、特
定のアプリケーションをリセットする SQL を発行してください:
manage.py reset appname
この操作で、 appname
に関係したテーブルが削除され、再度作成されます。
もしデータを削除したくないのなら、手作業で ALTER TABLE
文を実行せねば
なりません。
スキーマのアップデートを扱う外部プロジェクト のデファクトスタンダードは south です。
いいえ。サポートしているのは単カラムの主キーだけです。
しかし、実際には問題はありません。というのも、(unique_together
モデルオ
プションを指定したり、直接データベースに制約をかけたりして) 複数カラムにわ
たる一意性が保たれるようモデルレベルで制約をかけられるからです。単カラムの
主キーは admin インタフェースをうまく稼働させるため、例えば編集や削除対象の
オブジェクトを指定する簡潔な手段として必要であるにすぎません。
私達は、テーブルの形式のようなデータベース固有のオプションに対応するために
Django のコードに特殊なケースを追加しないよう心がけています。データベース固
有のオプションを使いたければ、
SQL の初期データファイル を作成して、その中で
ALTER TABLE
文を使うなどして自分の目的を実現してください。初期データ
ファイルはデータベースの中で CREATE TABLE
文の後に実行されます。
例えば、 MySQL を使っていて、 MyISAM テーブルタイプを使いたい場合には、初期 データファイルを作成して、以下のような行を挿入します:
ALTER TABLE myapp_mytable ENGINE=MyISAM;
SQL の初期データファイル <initial-sql> でも説明していますが、 SQL ファイ ルには任意の SQL コードを入れられるので、SQL で行なえる変更なら何でも実現で きます。
Django に既知のメモリリークはありません。 Django プロセスがメモリをどんどん
消費して、一向に開放する気配がない場合、 DEBUG
が True
にな
っていないか調べてみてください。 DEBUG
を True
にすると、
Django は実行した SQL 文の全てのコピーを保存するからです。
(クエリは django.db.connection.queries
で保存されます。
Django が実行している生の SQL クエリを見られますか? を参照してください。)
問題を解決するには、 DEBUG
を False
にしてください。
クエリリストを手動で消去するには、以下のように reset_queries()
を呼び出
してください:
from django import db
db.reset_queries()
Oct 26, 2017