我想编写一个查询,在其中我可以动态地将各种限制传递给SQLA Core。例如,我希望能够在SELECT查询中WHERE color = 'blue'指定或不动态指定。通过{'color': 'blue'}限制指令可能会很好,或者可能会有更标准的方法。
SELECT
WHERE color = 'blue'
{'color': 'blue'}
我已经阅读了教程和API文档,但我想知道:
对于SQLA Core中的动态限制,什么是惯用合同,它将如何实施?
您可以毫无问题地动态构建查询。例如,您可以执行以下操作:
query = select([table]) for key, value in params.iteritems(): query = query.where(table.columns[key] == value) print conn.execute(query).fetchall()
那里params只是限制的字典,如{'column': 'value'}。这将产生一个查询,其中所有 where 子句都与AND链接在一起。当然,如果您需要更复杂的 where 子句,则查询的构造可能会更加困难。
params
{'column': 'value'}
一个工作示例:
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()