FAQ : Bases de données et modèles

Comment est-ce que je peux voir les requêtes SQL brutes exécutées par Django ?

Vérifiez que le réglage Django DEBUG est défini à True. Ensuite, vous avez juste à faire ceci :

>>> 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 est uniquement disponible si DEBUG vaut True. C’est une liste de dictionnaires dans l’ordre d’exécution des requêtes. Chaque dictionnaire contient ce qui suit :

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

connection.queries comprend toutes les instructions SQL – INSERT, UPDATE, SELECT, etc. Chaque fois que votre application accède à la base de données, les requêtes sont journalisées. Notez que le SQL enregistré ici peut être mal mis en forme sous SQLite.

Si vous utilisez plusieurs bases de données, vous pouvez utiliser la même interface sur chaque membre du dictionnaire connections:

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

Puis-je utiliser Django avec une base de données pré-existante ?

Oui. Voir Intégration avec une base de données existante.

Si je fais des changements à un modèle, comment puis-je mettre à jour la base de données ?

Si cela ne vous dérange pas d’effacer les données, l’utilitaire manage.py a une option flush pour réinitialiser la base de données à l’état où elle se trouvait immédiatement après l’exécution de syncdb.

Si vous ne pouvez vous permettre de supprimer les données, vous devez exécuter les commandes ALTER TABLE manuellement dans votre base de données.

Il existe des projets externes qui gèrent les mises à jour de schéma, dont le standard de facto actuel est south.

Est-ce que les modèles de Django prennent en charge les clés primaires sur plusieurs colonnes ?

Non. Seules les clés primaires sur une seule colonne sont prises en charge.

Mais ce n’est pas un problème en pratique, car rien ne vous empêche d’ajouter d’autres contraintes (en utilisant l’option de modèle unique_together ou en créant la contrainte directement dans votre base de données), et de faire respecter l’unicité à ce niveau. Les clés primaires sur une seule colonne sont nécessaires au bon fonctionnement de l’interface d’administration ; par exemple quand il y a besoin d’un moyen simple pour être en mesure de désigner un objet à modifier ou à supprimer.

Comment puis-je ajouter des options spécifiques à la base de données dans mes commandes CREATE TABLE, telles que spécifier MyISAM comme type de table ?

Nous essayons d’éviter d’ajouter des cas spéciaux dans le code de Django pour accueillir toutes les options spécifiques aux bases de données telles que le type de table, etc. Si vous souhaitez utiliser une de ces options, créez un fichier de données SQL initiales qui contient les instructions ALTER TABLE faisant ce que vous voulez faire. Les fichiers de données initiales sont exécutés dans la base de données après les instructions CREATE TABLE.

Par exemple, si vous utilisez MySQL et que vous voulez que vos tables utilisent le type de table MyISAM, créez un fichier de données initiales et ajoutez-y quelque chose du genre :

ALTER TABLE myapp_mytable ENGINE=MyISAM;

Comme expliqué dans la documentation sur les fichiers de données SQL initiales, ce fichier SQL peut contenir du SQL arbitraire de sorte que vous pouvez faire n’importe quelle modification dont vous avez besoin.

Pourquoi Django provoque-t-il des fuites de mémoire ?

Django n’est pas connu pour provoquer des fuites de mémoire. Si vous trouvez que vos processus Django allouent de plus en plus de mémoire, sans aucun signe d’en libérer, assurez-vous que votre réglage DEBUG contient False. Si DEBUG vaut True, Django enregistre alors une copie de chaque instruction SQL qu’il exécute.

(Les requêtes sont enregistrées dans django.db.connection.queries. Cf. Comment est-ce que je peux voir les requêtes SQL brutes exécutées par Django ?)

Pour résoudre le problème, réglez DEBUG à False.

Si vous avez besoin d’effacer manuellement la liste des requêtes à tout moment dans vos fonctions, il suffit d’appeler reset_queries() comme ceci :

from django import db
db.reset_queries()