2010-03-04 8 views
5

Wie können Sie die SQL für ein Django-Modell des .save get(), dhGet SQL ein Django-Modell (oder nennen würde) auf .save()

from django.db import models 

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

Wie können Sie die SQL bekommen das würde in folgendem Szenario erstellt/verwendet werden:

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

Vielen Dank!

Antwort

4

Aus der FAQ Django:

Wie kann ich die rohe SQL finden Sie unter Abfragen Django läuft? Stellen Sie sicher, dass Ihre Django DEBUG-Einstellung auf True festgelegt ist. Dann tun Sie das einfach:

>>> 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 ist nur verfügbar, wenn DEBUG True ist. Es ist eine Liste von Wörterbüchern in der Reihenfolge der Abfrageausführung. Jedes Wörterbuch hat Folgendes:
sql - Die Raw-SQL-Anweisung
time - Wie lange die Anweisung dauerte, in Sekunden.
db.queries enthält alle SQL-Anweisungen - INSERTs, UPDATES, SELECTs usw.

+0

Danke, DrDee verwenden können. Wäre die letzte Abfrage dann db.queries [-1]? (oder, wenn das ein Iterator ist, list (db.queries) [- 1])? –

+2

Hier ist die FAQ in Frage: http://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running - Hinweis es ist 'von django.db import connection' und' connection.queries' –

+0

Ich vermute db.queries [-1], aber gib es einfach eine Chance und sehen, was passiert. – DrDee

2

Führen Sie einfach python manage.py sqlall APP_NAME.

4

Wenn Sie die Insert-Anweisung für das Modell erhalten wollen vor dem Speichern - Sie den folgenden Code (geprüft auf 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

Dies sollte die richtige Antwort sein. Es macht wenig Sinn, die save-Anweisung zu betrachten, nachdem sie bereits ausgeführt wurde, wenn man sich Gedanken darüber macht, wie sie die Daten verändert, und wir wollen sicherstellen, dass sie nichts Ungewöhnliches tut. – cerd

Verwandte Themen