SQLAlchemy Core 查询中的动态限制

Hat*_*sut 2 python sql sqlalchemy

我想编写一个查询,我可以在其中动态地将各种限制传递给 SQLA Core。例如,我希望能够动态指定或不指定SELECT查询WHERE color = 'blue'。传入{'color': 'blue'}限制字典可能会很好,或者可能有更标准的方法。

我已经阅读了教程和 API 文档,但我想知道:

SQLA Core 中动态限制的惯用契约是什么,它将如何实现?


pac*_*cha 5

您可以毫无问题地动态构建查询。例如,您可以执行以下操作:

query = select([table])
for key, value in params.iteritems():
    query = query.where(table.columns[key] == value)

print conn.execute(query).fetchall()
Run Code Online (Sandbox Code Playgroud)

whereparams只是一个限制字典,例如{'column': 'value'}. 这将产生一个查询,其中所有的where子句都用 AND 链接起来。当然,如果您需要更复杂的where子句,则查询的构造可能会更困难一些。

一个工作示例:

from sqlalchemy import select
from sqlalchemy import create_engine
from sqlalchemy import Column, String, Integer
from sqlalchemy.schema import MetaData, Table

# create engine and connection
DB_URI = "mysql+mysqldb://username:password@127.0.0.1:3306/database?charset=utf8mb4"
engine = create_engine(DB_URI, convert_unicode=True, echo=False)
conn = engine.connect()

# create table
metadata = MetaData()
pieces_table = Table('pieces', metadata,
    Column('id', Integer, primary_key=True),
    Column('size', String(60)),
    Column('color', String(60)),
)
metadata.create_all(engine)

# insert data
conn.execute(pieces_table.insert(), [
    {'size': 'small', 'color': 'blue'},
    {'size': 'large', 'color': 'blue'},
    {'size': 'small', 'color': 'red'},
])

# query data

def build_query(table, params):
    query = select([table])
    for key, value in params.iteritems():
        query = query.where(table.columns[key] == value)
    return query

params = {
    'size': 'large',
    'color': 'blue',
}
query = build_query(pieces_table, params)
print conn.execute(query).fetchall()
Run Code Online (Sandbox Code Playgroud)