📅  最后修改于: 2023-12-03 15:22:00.439000             🧑  作者: Mango
在使用 SQLalchemy 进行数据库操作时,我们有时需要获取生成的 SQL 语句,以便于调试或分析语句执行效率。本文将介绍如何从查询对象中提取 SQL 语句。
SQLalchemy 的查询操作会生成一个查询对象,我们可以通过 print 内置函数打印该对象来获取 SQL 语句。示例代码如下:
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(20))
engine = create_engine('sqlite:///test.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
query = session.query(User).filter(User.id == 1)
print(query)
输出结果为:
SELECT users.id AS users_id, users.name AS users_name
FROM users
WHERE users.id = ?
SQLalchemy 的查询对象中有一个内置属性 statement,它可以直接返回 SQL 语句。示例代码如下:
query = session.query(User).filter(User.id == 1)
print(query.statement)
输出结果与方法一相同:
SELECT users.id AS users_id, users.name AS users_name
FROM users
WHERE users.id = ?
SQLalchemy 的查询对象还有一个 compile 方法可以编译查询语句。通过设置参数 compile_kwargs,我们可以指定编译参数,如是否缩进等。示例代码如下:
query = session.query(User).filter(User.id == 1)
print(query.statement.compile(compile_kwargs={"literal_binds": True}))
输出结果:
SELECT users.id, users.name
FROM users
WHERE users.id = 1
通过比对发现,这个输出结果缩进更好看一些,并且将参数直接替换到查询语句中了。
以上就是从查询对象 SQLAlchemy 中提取 SQL 语句的三种方法,我们可以根据具体情况选择适用的方法。