Django-Dokumentation

FAQ: Datenbanken und Datenmodelle

Wie kann ich sehen, welche SQL-Queries Django ausführt?

Stell sicher, dass die DEBUG Einstellung auf True gesetzt ist und führe dann folgendes aus:

>>> 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 ist nur verfügbar, wenn DEBUG auf True steht. Es ist eine Liste von Dictionaries in der Reihenfolge der Queryausführung. Jedes Dictionary hat folgende Attribute:

sql -- Das SQL-Statement time -- Die Ausführungszeit des Statements in Sekunden.

connection.queries beinhaltet alle SQL-Statements wie z.B. INSERTs, UPDATEs oder SELECTs. Jedes mal, wenn deine Applikation die Datenbank nutzt, wird die Abfrage gespeichert.

Kann ich Django mit einer bereits bestehenden Datenbank nutzen?

Ja. Siehe dazu Integration mit einer bereits bestehenden Datenbank.

Wie aktualisiere ich die Datenbank wenn ich ein Datenmodell ändere?

Wenn es dir nichts ausmacht Daten zu löschen, kannst du mithilfe der manage.py deines Projektes das SQL für eine bestimmte Anwendung zurückzusetzen:

manage.py reset appname

Dies löscht alle Tabellen, die zu appname gehören und erstellt sie neu.

Falls dir bestehende Daten wichtig sind, musst du die ALTER TABLE-Statements manuell in deiner Datenbank ausführen. So haben wir es bisher immer gemacht, da das Behandeln von Daten eine sehr empfindliche Arbeit ist, die wir nicht automatisieren wollten. Dennoch wird daran gearbeitet, teilweise-automatisierte Datenbank-Aktualisierungen zu ermöglichen.

Unterstützen Djangos Datenmodelle mehrspaltige Primärschlüssel?

Nein, es werden lediglich einspaltige Primärschlüssel unterstützt.

Dies spielt in der Praxis jedoch keine große Rolle, da du die Einzigartigkeit auch durch andere Bedingungen (mithilfe der unique_together Modeloption oder durch das Erstellen der Bedingungen direkt in der Datenbank) durchsetzen kannst. Einspaltige Primary Keys werden z.B. für das Spezifizieren der zu editierenden oder zu löschenden Datensätze in der Administrationsoberfläche benötigt.

Wie kann ich Datenbank-spezifische Optionen, wie z.B. den MyISAM-Tabellentyp, zu meinen CREATE TABLE-Statements hinzufügen?

Wir versuchen Spezialfälle im Django-Code (z.B. Datenbank-spezifische Optionen wie Tabellentypen) zu vermeiden. Wenn du solch eine Option verwenden willst, kannst du dies durch eine SQL-Startdatei tun die z.B. ALTER TABLE-Statements enthält. SQL-Startdateien werden nach den CREATE TABLE-Statements in der Datenbank ausgeführt.

Wenn du beispielsweise MySQL verwendest und MyISAM als Tabellentyp spezifizieren willst, musst du eine SQL-Startdatei mit folgendem Inhalt anlegen:

ALTER TABLE myapp_mytable ENGINE=MyISAM;

Wie in der SQL-Startdatei-Dokumentation beschrieben, kann diese SQL-Datei beliebige SQL-Anweisungen enthalten und somit jegliche Art von Änderungen durchführen.

Warum belegt Django immer mehr Arbeitsspeicher?

Dies sollte normalerweise nicht passieren. Wenn deine Django-Prozesse grundlos immer mehr Speicher belegen und diesen nicht wieder freigeben, solltest du prüfen ob die DEBUG-Einstellung auf False steht. Sollte DEBUG auf True gesetzt sein, speichert Django eine Kopie jedes ausgeführten SQL-Statements.

(Die Queries werden in django.db.connection.queries gespeichert. Siehe Wie kann ich sehen, welche SQL-Queries Django ausführt?.)

Setze DEBUG auf False, um das Problem zu beheben.

Falls du die Query-Liste manuell in einer deiner Funktionen leeren möchtest, kannst du einfach die reset_queries()-Funktion ausführen:

from django import db
db.reset_queries()