📜  从查询对象 sqlalchemy 中提取 sql - SQL (1)

📅  最后修改于: 2023-12-03 15:22:00.439000             🧑  作者: Mango

从查询对象 sqlalchemy 中提取 sql - SQL

在使用 SQLalchemy 进行数据库操作时,我们有时需要获取生成的 SQL 语句,以便于调试或分析语句执行效率。本文将介绍如何从查询对象中提取 SQL 语句。

方法一:print 内置函数

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 内置属性

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 = ?
方法三:compile 方法

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 语句的三种方法,我们可以根据具体情况选择适用的方法。