2010-03-04 16 views
5

Làm thế nào bạn có thể nhận được SQL cho lệnh .save một mô hình của Django(), ví dụ:Nhận SQL một mô hình Django có (hoặc sẽ gọi) trên lệnh .save()

from django.db import models 

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

Làm thế nào bạn có thể nhận được SQL mà có được tạo/sử dụng trong trường hợp sau:

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

Cảm ơn!

Trả lời

4

Từ Câu hỏi thường gặp về Django:

Làm cách nào để xem các truy vấn SQL thô Django đang chạy? Đảm bảo cài đặt DEBUG Django của bạn được đặt thành True. Sau đó, chỉ cần thực hiện việc này:

>>> 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 chỉ khả dụng nếu DEBUG là True. Đó là danh sách các từ điển theo thứ tự thực hiện truy vấn. Mỗi từ điển có các thông tin sau:
sql - Câu lệnh SQL thô
time - Mất bao lâu để thực hiện câu lệnh.
db.queries bao gồm tất cả các câu lệnh SQL - INSERT, UPDATES, SELECTs, v.v.

+0

Cảm ơn, DrDee. Truy vấn gần đây nhất có phải là db.queries [-1] không? (hoặc, nếu đó là một trình lặp, danh sách (db.queries) [- 1])? –

+2

Đây là câu hỏi thường gặp được đề cập: http://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running - ghi chú đó là 'từ django.db kết nối nhập khẩu' và' connection.queries' –

+0

Tôi nghi ngờ db.queries [-1], nhưng chỉ cần cung cấp cho nó một shot và xem những gì sẽ xảy ra. – DrDee

2

Chỉ cần chạy python manage.py sqlall APP_NAME.

4

Nếu bạn muốn nhận được báo cáo chèn cho mô hình trước khi lưu - bạn có thể sử dụng đoạn mã sau (kiểm tra trên 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

Đây phải là câu trả lời đúng. Không có nhiều điểm trong việc xem xét câu lệnh lưu sau khi nó đã chạy, khi người ta lo ngại về việc nó làm thay đổi dữ liệu và chúng ta muốn chắc chắn rằng nó không làm gì lạ. – cerd

Các vấn đề liên quan