2017-06-06 11 views
0

SQLAコアにさまざまな制限を動的に渡すことができるクエリを記述します。たとえば、SELECTというクエリWHERE color = 'blue'に指定するか、動的に指定する必要があります。 {'color': 'blue'} restrictions-dictを渡すといいかもしれませんし、もっと標準的な方法があるかもしれません。SQLAlchemyコアクエリの動的制限

私はチュートリアルやAPIドキュメントを読んでいるが、私は思ったんだけど:

は何SQLAコアの動的な制限のために慣用的な契約となり、そしてそれがどのように実装されるでしょうか?


+1

あなたがやって、どのようにしているものに依存したいです。一般的には、あなたが 'Select'sを渡して[' where() '](http://docs.sqlalchemy.org/en/latest/core/selectable.html#sqlalchemy.sql.expression.Select必要に応じて。このようなディクテーションを使用する場合は、[literal_column() '](http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.literal_column)が便利です説明する。 –

答えて

1

動的に問合せを作成できます。たとえば、あなたが行うことができます:

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

print conn.execute(query).fetchall() 

paramsは、{'column': 'value'}などの制限だけの辞書です。これにより、のすべてが句とANDで連結されたクエリが生成されます。もちろん、より複雑なものが必要な場合の句は、クエリの構築が少し難しい場合があります。

作業例:

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:[email protected]: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() 
関連する問題