鍍金池/ 問答/Python  數(shù)據(jù)庫/ flask_sqlalchemy filter或filter_by怎樣使用in?

flask_sqlalchemy filter或filter_by怎樣使用in?

filter或filter_by怎樣使用in查詢同一字段的一組值,比如查詢name為"zhang","wang","li"的記錄,sql如下:

select * from table1 where name in ("zhang","wang","li");
回答
編輯回答
淚染裳

Column 對象 的 in_ 方法。
filter需要傳遞的參數(shù)為表達(dá)式,此處剛好。
filter_by需要傳遞關(guān)鍵字參數(shù),所以此處in_沒法使用。

in_OOP非OOP兩種模式中的使用-demo:

# 通用
from sqlalchemy import (
    create_engine,
    Column,
    Integer,
    String
)

# oop方式所需
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 非oop方式所需
from sqlalchemy import (
    Table,
    MetaData,
)
from sqlalchemy.sql import func


Base = declarative_base()

class Table1(Base):
    __tablename__ = 'table1'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(55))

    def __init__(self, name):
        super(Table1, self).__init__()
        self.id = None
        self.name = name

    def __repr__(self):
        return '<Table1 {0}>'.format(self.id if not self.id is None else '')

uri = 'sqlite:///:memory:'
engine = create_engine(uri)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine, autocommit=False)

############# 添加對象, 填充測試數(shù)據(jù)
session = Session()
for name in 'zhang,wang,li,gong,chen,zhao'.split(','):
    obj = Table1(name)
    session.add(obj)
session.commit()

lst_filter = ['wang', 'li', 'zhao']
############# OOP方式查詢
# 查詢總數(shù)
Q = session.query(Table1)
print(Q.count())
# 篩選
Q = Q.filter(Table1.name.in_(lst_filter))
result = Q.all()
print(result)
session.close()

############# 非OOP方式查詢
metadata = MetaData(bind=engine)
table = Table('table1', metadata, autoload=True)

# 查詢總數(shù)
stmt = func.count(table).select()
print(stmt.execute().fetchone())
# 篩選
stmt = table.select().where(table.c.name.in_(lst_filter))
rp = stmt.execute()
result = rp.fetchall()
# print(result)
print(len(result))

engine.dispose()

執(zhí)行結(jié)果:

6
[<Table1 2>, <Table1 3>, <Table1 6>]
(6,)
3

參考:

  • in_

    Implement the in operator.
    In a column context, produces the clause a IN other. “other” may be a tuple/list of column expressions, or a select() construct.
  • filter

    apply the given filtering criterion to a copy of this Query, using SQL expressions.
  • filter_by

    apply the given filtering criterion to a copy of this Query, using keyword expressions.
2017年5月6日 13:01
編輯回答
不討喜
Table.query.filter(name in ("zhang","wang","li"))
2017年5月9日 23:11