我正在尝试使用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的答案中如下。
答案 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',)]
它是"静态"正如人们所料。另请注意,在前面链接的文档(教程)中,数据 存储在构造中,只是没有呈现。