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)
这里的问题是字符串值自动包含在单引号中。您不能以这种方式动态插入列名。
关于你的问题,我不确定 sqlite3,但在 MySQLdb 中你可以得到最终的查询,如下所示(我目前不在计算机上检查):
statement % conn.literal(query_params)
Run Code Online (Sandbox Code Playgroud)