针对filter()的相关功能进行详细的说明(filtery以及filter_by()在上一篇中进行了说明,filter_by()适应性较差,好像只能在=的语句中适用)
1、equals(相等条件)
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import func, Column, String, Integer, Enum
from sqlalchemy.orm import sessionmaker
USERNAME = "root"
PASSWORD = "147258"
PORT = 3306
HOSTNAME = "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)
**