使用SQLAlchemy识别列表中的哪些值在“表”列中不存在

时间:2018-07-27 20:40:08

标签: python sqlalchemy

我有一个列表cities = ['Rome', 'Barcelona', 'Budapest', 'Ljubljana']

然后

我有一个sqlalchemy模型,如下所示-

class Fly(Base):

    __tablename__ = 'fly'

    pkid = Column('pkid', INTEGER(unsigned=True), primary_key=True, nullable=False)
    city = Column('city', VARCHAR(45), unique=True, nullable=False)
    country = Column('country', VARCHAR(45))
    flight_no = Column('Flight', VARCHAR(45))

我需要检查给定cities列表中的所有值是否都在飞行表中或不使用sqlalchemy。仅当表中存在所有城市时才返回true。即使表中不存在单个城市,我也需要返回false和不存在的城市列表。怎么做?有什么想法/提示/建议吗?我正在使用MYSQL

1 个答案:

答案 0 :(得分:2)

一种方法是在给定列表的基础上创建(临时)关系,并从飞行表格中获取与城市之间的设置差异。换句话说,创建列表 1 中的值的并集:

from sqlalchemy import union, select, literal

cities_union = union(*[select([literal(v)]) for v in cities])

然后采取不同的做法:

sq = cities_union.select().except_(select([Fly.city]))

并检查差异后是否没有剩余行:

res = session.query(~exists(sq)).scalar()

对于缺少飞行桌的城市,请省略(不存在):

res = session.execute(sq).fetchall()

1 其他数据库供应商可能会提供从数组产生关系的替代方法,例如Postgresql及其unnest()