获取SQL一个Django模型已经(或将调用).save()

Bri*_*unt 5 sql django django-models

你怎么能得到Django模型的.save()的SQL,即

from django.db import models

class MyM(models.Model):
   text = models.TextField()
Run Code Online (Sandbox Code Playgroud)

如何获取将在以下场景中创建/使用的SQL:

 >>> m = MyM(text="123")
 >>> m.save()
 # What SQL Django just run?
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 6

如果你想在保存之前获取模型的insert语句 - 你可以使用以下代码(在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]
Run Code Online (Sandbox Code Playgroud)

  • 这个答案在“if”语句中有语法错误...... (2认同)

DrD*_*Dee 4

来自 Django 常见问题解答:

如何查看 Django 正在运行的原始 SQL 查询?确保您的 Django DEBUG 设置设置为 True。然后,只需这样做:

>>> 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'}]  
Run Code Online (Sandbox Code Playgroud)

db.queries 仅在 DEBUG 为 True 时可用。它是按查询执行顺序排列的字典列表。每个字典都有以下内容:
sql--原始 SQL 语句
time-- 语句执行所需的时间(以秒为单位)。
db.queries 包含所有 SQL 语句——INSERT、UPDATES、SELECT 等。

  • 这是有问题的常见问题解答:http://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running - 请注意`from django.db import connection` 和 `connection.queries` (2认同)