Sqlalchemy获取原生语句直接调试的方法
最近工作是对数据库执行效率进行调优,项目使用的是sqlalchemy的orm框架,自然要观察框架生成的sql语句:
目前网上博客的处理方式大致是在创建engine的同时指定echo参为数True
1 |
|
这样能够在控制台输出sql的详细信息:
1 |
|
但是其实很多信息是我们并不关心的。
据了解mybaits有个pycharm插件是通过命令行输出拼装出能够直接执行的sql插件
mybaits-log
但是这种实现方式有平台的局限性,所以想直接通过代码获取sql然后进行组装
经过了解sqlalchemy为了防止注入并不不会拼装sql参数进入语句中,但是这并不要紧,我们可以自己拼装进去。
经过翻阅文档发现这样一个类sqlalchemy.events.
ConnectionEvents
¶)
The methods here define the name of an event as well as the names of members that are passed to listener functions.
所以我们基于这样的事件可以完成以下功能(具体细节可以参阅上面的文档 已添加链接):
from sqlalchemy import event
@event.listens_for(engine, "before_cursor_execute")
def comment_sql_calls(conn, cursor, statement, parameters, context, executemany):
raw_sql = statement%parameters
print(raw_sql)
此时我们去掉echo的参数
每次sql执行之前就会输出对应的语句
1 |
|
只需要添加这几行代码就可以完美解决sql输出的问题
当然这个事件触发还可以完成很多功能。
demo地址:https://github.com/JohnDoe117/sqlalchemy_sql_log