sqlite3 with python - 查询调试 - 打印最终查询

jon*_*ohn 5 python sqlite debugging profiler

我正在尝试调试使用 python 模块生成的 SQL 语句sqlite3...

c.execute("SELECT * FROM %s WHERE :column = :value" % Photo.DB_TABLE_NAME, {"column": column, "value": value})
Run Code Online (Sandbox Code Playgroud)

当我执行以下操作时,它不返回任何行fetchall()

当我直接在数据库上运行它时

SELECT * FROM photos WHERE album_id = 10
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果。

有没有办法查看构造的查询以了解问题所在?

Aus*_*art 16

要真正回答您的问题,您可以使用set_trace_callback连接对象的 来附加打印功能;这将使所有查询在执行时被打印。这是一个实际的例子:

# Import and connect to database
import sqlite3
conn = sqlite3.connect('example.db')
# This attaches the tracer
conn.set_trace_callback(print)
# Get the cursor, execute some statement as an example
c = conn.cursor()
c.execute("CREATE TABLE stocks (symbol text)")
t = ('RHAT',)
c.execute("INSERT INTO stocks VALUES (?)", t)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print(c.fetchone())
Run Code Online (Sandbox Code Playgroud)

这会产生输出:

CREATE TABLE stocks (symbol text)
BEGIN 
INSERT INTO stocks VALUES ('RHAT')
SELECT * FROM stocks WHERE symbol='RHAT'
('RHAT',)
Run Code Online (Sandbox Code Playgroud)


new*_*ver 2

这里的问题是字符串值自动包含在单引号中。您不能以这种方式动态插入列名。

关于你的问题,我不确定 sqlite3,但在 MySQLdb 中你可以得到最终的查询,如下所示(我目前不在计算机上检查):

statement % conn.literal(query_params)
Run Code Online (Sandbox Code Playgroud)