针对filter()的相关功能进行详细的说明(filtery以及filter_by()在上一篇中进行了说明,filter_by()适应性较差,好像只能在=的语句中适用)
1、equals(相等条件)
from sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import func, Column, String, Integer, Enumfrom sqlalchemy.orm import sessionmakerUSERNAME = "root"PASSWORD = "147258"PORT = 3306HOSTNAME = "127.0.0.1"DATABASE = "my_sql"SLDG = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"engine = create_engine(SLDG)Base = declarative_base(engine)class Sheet(Base):__tablename__ = "sheet5"id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(10), nullable=False)gender = Column(Enum("男", "女"), default="男")age = Column(Integer)def __str__(self):return f"id: {self.id}, name: {self.name}, gender: {self.gender}, age: {self.age}"Base.metadata.create_all()session = sessionmaker(bind=engine)()# 筛选出年龄为18的dates = session.query(Sheet).filter_by(age=18).all()for date in dates:print(date)print("-"*100)# 筛选出年龄不是18的,注意<>表示不等于是在python2以及数据库语句中有效,python不接受numbers = session.query(Sheet).filter(Sheet.age != 18).all()for number in numbers:print(number)
效果:
2、like(模糊查询)
numbers = session.query(模型).filter(模型.字段.like("相关的条件")).all()
小例子:查询包含龚字的数据(%表示任意字符)
results = session.query(Sheet).filter(Sheet.name.like("%龚%"))for result in results:print(result)
3、in,notin
in_()
相关说明:
1、由于in是关键词,所以在后面加上一个,放前边的是私有的意思(和__意思一致)
2、in([xxx, yyy]),表示的在xxx或者yyy中选择,而不是xxx到yyy这个范围
3、in([xxx, yyy])效果等同于in((xxx, yyy)),不过一般使用前者
4、in_([元组1,元组2])这种写法的用途待续
小例子:查找有流浪者和吴艳新的数据
results = session.query(Sheet).filter(Sheet.name.in_(['流浪者', '吴艳新'])).all()for result in results:print(result)
返回效果:
notin_():
~写法(可读性较差)
小例子:查找没有有流浪者和吴艳新的数据
results = session.query(Sheet).filter(~Sheet.name.in_(['流浪者', '吴艳新'])).all()for result in results:print(result)
返回效果:
notin_写法
小例子:查找没有有流浪者和吴艳新的数据
results = session.query(Sheet).filter(Sheet.name.notin_(['流浪者', '吴艳新'])).all()for result in results:print(result)
返回效果:
~和notin_一起的效果是双重否定变肯定
results = session.query(Sheet).filter(~Sheet.name.notin_(['流浪者', '吴艳新'])).all()for result in results:print(result)
4、is_以及isnot
注意点:
1、Null和None是不相同的,Null表示的没有开辟内存空间,而None则表示开辟了内存空间,只是没有相关内容而已
2、python中没有Null的写法,只有None
3、isnot是不需要加_的
小例子:找出所有年龄字段中为空的数据
方法一:
results = session.query(Sheet).filter(Sheet.age == None).all()for result in results:print(result)
方法二:
results = session.query(Sheet).filter(Sheet.age.is_(None)).all()for result in results:print(result)
5、and以及or
这两者需要进行导入
from sqlalchemy import and_, or_
实现and_效果的三种写法
小例子:满足姓名包含龚字并且性别为男的数据
第一种:
results = session.query(Sheet).filter(Sheet.name.like("%龚%")).filter(Sheet.gender == "男").all()for result in results:print(result)
第二种:
results = session.query(Sheet).filter(Sheet.name.like("%龚%"), Sheet.gender == "男").all()for result in results:print(result)
第三种:
results = session.query(Sheet).filter(and_(Sheet.name.like("%龚%"), Sheet.gender == "男")).all()for result in results:print(result)
or_
小例子:找出姓名为包含龚或者年龄为17的数据
results = session.query(Sheet).filter(or_(Sheet.name.like("%龚%"), Sheet.age == 17)).all()for result in results:print(result)
**

