One - One Code All

Blog Content

flask,SQLAlchemy的in和not in等查询方式总结

Python   2017-04-25 21:21:40

flask,SQLAlchemy的in和not in等查询方式总结


官方参考:https://docs.sqlalchemy.org/en/13/orm/tutorial.html#common-filter-operators


in 查询, table.id.in_(list_ids)

[Shoe.query.filter_by(id=id).one() for id in my_list_of_ids]


shoes = Shoe.query.filter(Shoe.id.in_(my_list_of_ids)).all()

[next(s for s in shoes if s.id == id) for id in my_list_of_ids]


not in, 使用~符号,或者not_,(from sqlalchemy.sql.expression):

~User.id.in_([123,456])

not_(User.id.in_([123,456]))


eg1.

id_list = [1, 2, 3, 4, 5] # in most case we have an integer list or set

s = text('SELECT id, content FROM myTable WHERE id IN :id_list')

conn = engine.connect() # get a mysql connection

rs = conn.execute(s, id_list=tuple(id_list)).fetchall()


eg2.

ids_list = [1,2,3]

query = "SELECT id, name FROM user WHERE id IN %s" 

args = [(ids_list,)] # Don't forget the "comma", to force the tuple

conn.execute(query, args)


eg3.

user.id.notin_(tuple(list_ids)).update(data,synchronize_session=False)


eg4.

query = query.where(not_(user_model.User.email.like(email)))


eg5.

def get_all_batches(self):

        query = sqlalchemy.select([

            self._batches,

            sqlalchemy.not_(sqlalchemy.exists(

                sqlalchemy.select([1]).where(sqlalchemy.and_(

                    self._batches.c.id == self._batch_entries.c.batch_id,

                    self._batch_entries.c.crtsh_id == self._certs.c.crtsh_id,

                    self._certs.c.expiration_date > datetime.datetime.utcnow(),

                    self._certs.c.revoked_at.is_(None),

                ))

            ))

        ])

        rows = self._engine.execute(query)

        return [

            Batch(

                id=id,

                description=description,

                completed=completed,

            )

            for id, description, completed in rows

        ] 



几种常见sqlalchemy查询:

#简单查询

print(session.query(User).all())

print(session.query(User.name, User.fullname).all())

print(session.query(User, User.name).all())


#带条件查询

print(session.query(User).filter_by(name='user1').all())

print(session.query(User).filter(User.name == "user").all())

print(session.query(User).filter(User.name.like("user%")).all())


#多条件查询

print(session.query(User).filter(and_(User.name.like("user%"), User.fullname.like("first%"))).all())

print(session.query(User).filter(or_(User.name.like("user%"), User.password != None)).all())


#sql过滤

print(session.query(User).filter("id>:id").params(id=1).all())


#关联查询 

print(session.query(User, Address).filter(User.id == Address.user_id).all())

print(session.query(User).join(User.addresses).all())

print(session.query(User).outerjoin(User.addresses).all())


#聚合查询

print(session.query(User.name, func.count('*').label("user_count")).group_by(User.name).all())

print(session.query(User.name, func.sum(User.id).label("user_id_sum")).group_by(User.name).all())


#子查询

stmt = session.query(Address.user_id, func.count('*').label("address_count")).group_by(Address.user_id).subquery()

print(session.query(User, stmt.c.address_count).outerjoin((stmt, User.id == stmt.c.user_id)).order_by(User.id).all())


#exists

print(session.query(User).filter(exists().where(Address.user_id == User.id)))

print(session.query(User).filter(User.addresses.any()))



限制返回字段查询


person = session.query(Person.name, Person.created_at,                     

             Person.updated_at).filter_by(name="zhongwei").order_by(            

             Person.created_at).first()


记录总数查询:


from sqlalchemy import func

 

# count User records, without

# using a subquery.

session.query(func.count(User.id))

 

# return count of user "id" grouped

# by "name"

session.query(func.count(User.id)).group_by(User.name)

 

from sqlalchemy import distinct

 

# count distinct "name" values

session.query(func.count(distinct(User.name)))



上一篇:flask,sqlalchemy中使用in_,报错Cannot evaluate clauselist,synchronize_session
下一篇:python pandas dataframe 行列选择,切片操作方法

The minute you think of giving up, think of the reason why you held on so long.