You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:32:37