如何将sqlalchemy查询的绑定参数作为字典获取?

124*_*316 7 python sql sqlalchemy

我知道有一种方法可以从任何 sqlalchemy 查询对象打印实际的 sql 查询。但是,我想将查询用作参数化形式,而不呈现参数的值。

例如,打印的查询如下所示。

SELECT "user".id AS user_id, "user".hashed_pw AS user_hashed_pw, 
"user".name AS user_name, "user".tel AS user_tel, "user".email AS user_email, 
"user".created_time AS user_created_time FROM "user" 
WHERE "user".name = :name_1 AND "user".age < :age_1
Run Code Online (Sandbox Code Playgroud)

我将 name_1 作为 'john' 传递,age_1 作为 30 传递,但我不知道如何获取 name_1 和 age_1 的值。我想要一本像 {'name_1':'john', 'age_1':30} 这样的字典。

我怎样才能做到这一点?

saa*_*aaj 6

当 ORM 查询被编译时,它会变成sqlalchemy.engine.Compiled. 它有statement属性,这是一个sqlalchemy.sql.expression.ClauseElementparams属性的属性。

In [3]: query = session.query(User).filter(User.age > 18, User.name == 'joe')
   ...: query.statement.compile().params
Out[3]: {'age_1': 18, 'name_1': 'joe'}
Run Code Online (Sandbox Code Playgroud)

以及典型的 SQLAlchemy ORM 样板以确保完整性。

In [1]: import sqlalchemy as sa
   ...: from sqlalchemy.ext.declarative import declarative_base
   ...: from sqlalchemy.sql import func
   ...:
   ...: Base = declarative_base()
   ...:
   ...: class User(Base):
   ...:
   ...:     __tablename__ = 'user'
   ...:
   ...:     id = sa.Column(sa.Integer, primary_key=True)
   ...:     age = sa.Column(sa.Integer)
   ...:     hashed_pw = sa.Column(sa.String)
   ...:     name = sa.Column(sa.String)
   ...:     tel = sa.Column(sa.String)
   ...:     email = sa.Column(sa.String)
   ...:     created_time = sa.Column(sa.DateTime, server_default=func.now())

In [2]: engine = sa.create_engine('sqlite://')
   ...: Base.metadata.create_all(engine)
   ...: Session = sa.orm.sessionmaker(bind=engine)
   ...: session = Session()
   ...:
   ...: user1 = User(age=20, name='joe')
   ...: user2 = User(age=22, name='jon')
   ...: session.add_all([user1, user2])
   ...: session.commit()
Run Code Online (Sandbox Code Playgroud)