如何查看Flask中db.execute生成的原始SQL语句?
在Flask 2.3中查看生成的SQL以调试in查询问题
查看生成SQL的几种方法
启用SQLAlchemy日志输出:如果你的
db是Flask-SQLAlchemy的实例,直接在配置里开启DEBUG级别的日志,就能看到执行的完整SQL和参数绑定情况。添加以下配置:app.config['SQLALCHEMY_ECHO'] = True运行程序后,控制台会打印所有执行的SQL语句,包括参数替换后的最终形态。
手动打印参数化语句的实际执行形态:调试时可以用数据库连接的
mogrify方法(适用于psycopg2等适配器),直接生成最终执行的SQL字符串:stmt = db.execute('select * from d where id in (?)', ("(1,2)",)) print(stmt.cursor.mogrify(stmt.statement, stmt.parameters))这会输出数据库实际执行的带参数的SQL语句,能直观看到参数是怎么被替换的。
直接拼接调试(仅用于排查,禁止生产环境使用):简单场景下可以手动把参数替换到SQL里(注意SQL注入风险,只用来调试):
sql = 'select * from d where id in (?)' params = ("(1,2)",) print(sql % params)
顺便解决你的in查询问题
你当前的写法db.execute('select * from d where id in (?)', ("(1,2)",))有问题:参数"(1,2)"会被当成单个字符串值,最终生成的SQL是select * from d where id in ('(1,2)'),相当于找id等于字符串"(1,2)"的记录,自然查不到预期结果。
正确的写法应该把列表作为参数传入(不同数据库适配器支持略有差异):
- 对于SQLite:
rows = db.execute('select * from d where id in (?)', ([1,2],)).fetchall() - 通用写法(用多个占位符):
ids = [1,2] placeholders = ','.join(['?']*len(ids)) rows = db.execute(f'select * from d where id in ({placeholders})', ids).fetchall()
内容的提问来源于stack exchange,提问作者bolegebi
相关产品推荐
相关产品推荐

