2010-03-04 5 views
5

Comment pouvez-vous obtenir le SQL pour le .save d'un modèle Django(), à savoirGet SQL un modèle Django a (ou appellerait) sur .save()

from django.db import models 

class MyM(models.Model): 
    text = models.TextField() 

Comment pouvez-vous obtenir le SQL qui serait être créé/utilisé dans le scénario suivant:

>>> m = MyM(text="123") 
>>> m.save() 
# What SQL Django just run? 

Merci!

Répondre

4

De la FAQ Django:

Comment puis-je voir les requêtes SQL brutes Django est en marche? Assurez-vous que votre paramètre Django DEBUG est défini sur True. Ensuite, faites simplement ceci:

>>> from django.core.db import db 
>>> db.queries 
[{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls', 
'time': '0.002'}] 

db.queries n'est disponible que si DEBUG est True. C'est une liste de dictionnaires dans l'ordre d'exécution de la requête. - L'instruction SQL brute
time - La durée d'exécution de l'instruction, en secondes. Db.queries inclut toutes les instructions SQL - INSERT, UPDATES, SELECT, etc.

+0

Merci à tous, DrDee. Est-ce que la requête la plus récente serait alors db.queries [-1]? (ou, si c'est un itérateur, liste (db.queries) [- 1])? –

+2

Voici la FAQ en question: http://docs.djangoproject.com/fr/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running - note c'est '' de connection d'importation django.db'' et 'connection.queries' –

+0

Je suspecte db.queries [-1], mais donne juste un coup de feu et vois ce qui se passe. – DrDee

2

Exécutez simplement python manage.py sqlall APP_NAME.

4

Si vous voulez obtenir l'instruction d'insertion pour le modèle avant d'enregistrer - vous pouvez utiliser le code suivant (vérifié sur django 1.4)

from django.db import connection 
from django.db.models import sql 

def object_to_query(objects): 
    if isinstance(objects, (list, tuple) 
    values = obj._meta.local_fields 
    q = sql.InsertQuery(obj) 
    q.insert_values(values, [obj]) 
    compiler = q.get_compiler('default') 
    # Normally, execute sets this, but we don't want to call execute 
    setattr(compiler, 'return_id', False) 
    stmts = compiler.as_sql() 
    stmt = [stmt % params for stmt, params in stmts] 
    return stmt[0] 
+0

Cela devrait être la bonne réponse. Il n'y a pas grand intérêt à regarder l'instruction save après qu'elle a déjà été exécutée, quand on s'inquiète de la façon dont elle modifie les données et que l'on veut s'assurer que ça ne fasse rien de bizarre. – cerd

Questions connexes