1. 创建多对多的表单
每次进行新的操作之前,记得是清空之前test
数据库中的内容,如下
然后创建表单数据,代码如下,通过创建的第三张表单,里面的user_id
和language_id
来关联之前的表单,注意relationship
中多了一个secondary = User2Lan
的参数设定
from sqlalchemy import create_engine,Column,String,Integer,ForeignKey,Table
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine(
'mysql+pymysql://root:lx520828@127.0.0.1:3306/test',
max_overflow = 5, #超过连接池大小外最多可以创建的连接
pool_size = 10, #连接池的大小
echo = True, #调试信息展示
)
Base = declarative_base()
User2Lan = Table('user_2_language',Base.metadata,
Column('user_id',ForeignKey('user.id'),primary_key = True),
Column('language_id',ForeignKey('language.id'),primary_key = True))
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key = True, autoincrement=True)
name = Column(String(125), nullable = True)
gender = Column(String(10), nullable = True, default = '保密')
town = Column(String(125))
language = relationship('Language',
secondary = User2Lan,
backref = 'user',
cascade = 'all,delete')
class Language(Base):
__tablename__ = 'language'
id = Column(Integer, primary_key = True, autoincrement = True)
name = Column(String(125), nullable = True)
advantage = Column(String(125), nullable=True)
disadvantage = Column(String(125), nullable=True)
Base.metadata.create_all(engine)
→ 输出的结果为:(三张表单已经创建完毕)
2. 多对多添加数据
这一部分和之前的表单一对多基本上没有什么区别,修改的地方是L1.user.append(u1),而不是原来的L1.user = u1,代码如下
# Base.metadata.create_all(engine)
if __name__ == '__main__':
Session = sessionmaker(engine)
session = Session()
#添加数据
#添加用户
u1 = User(name = '张三', gender = '男', town = '北京')
u2 = User(name = '李四', gender = '女', town = '上海')
session.add_all([u1,u2])
session.commit()
#添加语言
L1 = Language(name = 'python',
advantage = '开发快',
disadvantage = '运行慢')
L1.user.append(u1) #注意这里的区别
session.add(L1)
session.commit()
#添加关联表单数据
u3 = User(name = '王五', gender = '女', town = '深圳')
u3.language = [
Language(name = 'python',
advantage = '开发快',
disadvantage = '运行慢'),
Language(name = 'c',
advantage = '稳定',
disadvantage = '上手慢')
]
session.add(u3)
session.commit()
→ 输出的结果为:(除了之前的user和language的表单外,还有一个user_2_language表单,这个就是创建第三张表,将之前的表单通过中转站链接在一起了)
3. 多对多删除数据
这里采用查询删除的方式进行删除数据,也就是四依据某些条件来删除数据,代码如下
u = session.query(User).filter(User.id==3).first()
session.delete(u)
session.commit()
→ 输出的结果为:(这里的id是3,删除后如果再添加数据的话,id就从4开始)
4. 多对多修改数据
这一部分注意id的变化,因为是多张表单,搞清楚顺序,代码如下,上一步删除了u3的数据,这一步重新加载回来,并进行数据的修改,这里修改的是关联表单的第一个数据中的name
u3 = User(name = '王五', gender = '女', town = '深圳')
u3.language = [
Language(name = 'python',
advantage = '开发快',
disadvantage = '运行慢'),
Language(name = 'c',
advantage = '稳定',
disadvantage = '上手慢')
]
session.add(u3)
session.commit()
u = session.query(User).filter(User.id==4).first()
u.language[0].name = 'python3'
session.commit()
→ 输出的结果为:(可以发现用户的信息id为4,分别对应语言的4和5,实现了多对多表单数据的修改)
5. 多对多数据查询
① 查询数据量
num = session.query(User).filter(User.id>0).count()
print(num)
→ 输出的结果为:
3
② 数据排列
uid1 = session.query(User).order_by(-User.id).all()[:]
for id in uid1:
print(id.name)
③ 数据筛选,逻辑或
from sqlalchemy import or_,and_
uid2 = session.query(User).filter(or_(User.id==1,User.id==2)).all()[:]
for id in uid2:
print(id.name)
→ 输出的结果为:
李四
张三
④ 数据筛选,逻辑和
uid3 = session.query(User).filter(and_(User.id == 1, User.name == '张三')).all()[:]
for id in uid3:
print(id.name)
→ 输出的结果为:
张三
⑤ 数据筛选, 条件匹配
%
:表示零个或者多个字符
_
:表示任何单个字符
[ ]
:表示括号内所列字符中的一个
[^]
:表示不在括号所列之内的单个字符
uid4 = session.query(User).filter(or_(User.name.like('_三'))).all()[:]
for id in uid4:
print(id.name)
→ 输出的结果为:(这里就是使用正则表达式进行匹配数据)
张三