针对filter()的相关功能进行详细的说明(filtery以及filter_by()在上一篇中进行了说明,filter_by()适应性较差,好像只能在=的语句中适用)

1、equals(相等条件)

  1. from sqlalchemy import create_engine
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy import func, Column, String, Integer, Enum
  4. from sqlalchemy.orm import sessionmaker
  5. USERNAME = "root"
  6. PASSWORD = "147258"
  7. PORT = 3306
  8. HOSTNAME = "127.0.0.1"
  9. DATABASE = "my_sql"
  10. SLDG = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  11. engine = create_engine(SLDG)
  12. Base = declarative_base(engine)
  13. class Sheet(Base):
  14. __tablename__ = "sheet5"
  15. id = Column(Integer, primary_key=True, autoincrement=True)
  16. name = Column(String(10), nullable=False)
  17. gender = Column(Enum("男", "女"), default="男")
  18. age = Column(Integer)
  19. def __str__(self):
  20. return f"id: {self.id}, name: {self.name}, gender: {self.gender}, age: {self.age}"
  21. Base.metadata.create_all()
  22. session = sessionmaker(bind=engine)()
  23. # 筛选出年龄为18的
  24. dates = session.query(Sheet).filter_by(age=18).all()
  25. for date in dates:
  26. print(date)
  27. print("-"*100)
  28. # 筛选出年龄不是18的,注意<>表示不等于是在python2以及数据库语句中有效,python不接受
  29. numbers = session.query(Sheet).filter(Sheet.age != 18).all()
  30. for number in numbers:
  31. print(number)

效果:
image.png

2、like(模糊查询)

  1. numbers = session.query(模型).filter(模型.字段.like("相关的条件")).all()

小例子:查询包含龚字的数据(%表示任意字符)

  1. results = session.query(Sheet).filter(Sheet.name.like("%龚%"))
  2. for result in results:
  3. print(result)

查询结果:
image.png

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])这种写法的用途待续
小例子:查找流浪者和吴艳新的数据

  1. results = session.query(Sheet).filter(Sheet.name.in_(['流浪者', '吴艳新'])).all()
  2. for result in results:
  3. print(result)

返回效果:
image.png
notin_():
~写法(可读性较差)
小例子:查找没有有流浪者和吴艳新的数据

  1. results = session.query(Sheet).filter(~Sheet.name.in_(['流浪者', '吴艳新'])).all()
  2. for result in results:
  3. print(result)

返回效果:
image.png
notin_写法
小例子:查找没有有流浪者和吴艳新的数据

  1. results = session.query(Sheet).filter(Sheet.name.notin_(['流浪者', '吴艳新'])).all()
  2. for result in results:
  3. print(result)

返回效果:
image.png
~和notin_一起的效果是双重否定变肯定

  1. results = session.query(Sheet).filter(~Sheet.name.notin_(['流浪者', '吴艳新'])).all()
  2. for result in results:
  3. print(result)

返回效果:
image.png

4、is_以及isnot

注意点:
1、Null和None是不相同的,Null表示的没有开辟内存空间,而None则表示开辟了内存空间,只是没有相关内容而已
2、python中没有Null的写法,只有None
3、isnot是不需要加_的
小例子:找出所有年龄字段中为空的数据
方法一:

  1. results = session.query(Sheet).filter(Sheet.age == None).all()
  2. for result in results:
  3. print(result)

方法二:

  1. results = session.query(Sheet).filter(Sheet.age.is_(None)).all()
  2. for result in results:
  3. print(result)

数据库:加入李浩测试数据
image.png
查询结果:
image.png

5、and以及or

这两者需要进行导入

  1. from sqlalchemy import and_, or_

实现and_效果的三种写法

小例子:满足姓名包含龚字并且性别为男的数据
第一种:

  1. results = session.query(Sheet).filter(Sheet.name.like("%龚%")).filter(Sheet.gender == "男").all()
  2. for result in results:
  3. print(result)

第二种:

  1. results = session.query(Sheet).filter(Sheet.name.like("%龚%"), Sheet.gender == "男").all()
  2. for result in results:
  3. print(result)

第三种:

  1. results = session.query(Sheet).filter(and_(Sheet.name.like("%龚%"), Sheet.gender == "男")).all()
  2. for result in results:
  3. print(result)

or_
小例子:找出姓名为包含龚或者年龄为17的数据

  1. results = session.query(Sheet).filter(or_(Sheet.name.like("%龚%"), Sheet.age == 17)).all()
  2. for result in results:
  3. print(result)

**