如何在SQL Alchemy中生成常量WHERE条件?

时间:2017-10-25 07:05:50

标签: python sqlalchemy

我正在尝试使用SQLAlchemy生成某个SQL语句,其中数据库中存在现有架构和数据。我接近这个:

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, Table
from sqlalchemy.ext.declarative import declarative_base

Session = sessionmaker()
engine = create_engine('sqlite:///example.db')
Session.configure(bind=engine)
session = Session()
base = declarative_base()
base.metadata.reflect(engine)

table = Table('dane', base.metadata, autoload=True)
q = session.query(table).filter(table.c.title == 'A')
print(q)

当我从上面的代码中检查渲染(生成的)查询时,它会生成:

SELECT dane.title AS dane_title, dane.body AS dane_body 
FROM dane 
WHERE dane.title = ?

我不需要动态声明,我需要查询中的? 完全 A.filter调用建议。如何使用SQLAlchemy实现常量WHERE表达式?

更新

SA实际上确实生成了常量WHERE条件。要查看它们,您需要将特殊的kwargs传递给compile():

.compile(compile_kwargs={"literal_binds": True})

在@ metatoaster的答案中如下。

1 个答案:

答案 0 :(得分:1)

生成时的查询已经是静态的,但看起来不受限制是因为sqlalchemy always parameterize all query values无论它们来自to prevent SQL injection attacks by default。然而,这并不意味着查询不是静态的。有关完整示例,请在内存中创建一个表(使用sqlalchemy)以及其他设置。

>>> from sqlalchemy import MetaData, create_engine, Table, Column, String
>>> metadata = MetaData()
>>> metadata.bind = create_engine('sqlite:///')
>>> table = Table('table', metadata,
...     Column('name', String(), nullable=False),
... )
>>> metadata.create_all()
>>> table.insert().values(name='value').execute()

获取通用查询以查看我们获得了一些数据。

>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker()
>>> Session.configure(bind=metadata.bind)
>>> session = Session()
>>> session.query(table).all()
[('value',)]

现在,我们不是提供字符串,而是为查询提供变量。

>>> value = 'value'
>>> q = session.query(table).filter(table.c.name == value)

更改值,执行查询

>>> value = 'somethingelse'
>>> q.all()
[('value',)]

它是"静态"正如人们所料。另请注意,在前面链接的文档(教程)中,数据 存储在构造中,只是没有呈现。