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} 这样的字典。
我怎样才能做到这一点?
当 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'}
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)
归档时间: |
|
查看次数: |
1489 次 |
最近记录: |