【问题标题】:how to get bound parameters of sqlalchemy query as dictionary?如何将 sqlalchemy 查询的绑定参数作为字典获取?
【发布时间】:2016-09-19 07:06:44
【问题描述】:

我知道有一种方法可以从任何 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

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

我该怎么做?

【问题讨论】:

标签: python sql sqlalchemy


【解决方案1】:

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

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'}

为了完整性,典型的 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()

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多