0
点赞
收藏
分享

微信扫一扫

【爬虫高阶】Mysql数据库表单多对多数据的增添删改及查询


1. 创建多对多的表单

每次进行新的操作之前,记得是清空之前​​test​​数据库中的内容,如下

【爬虫高阶】Mysql数据库表单多对多数据的增添删改及查询_python


然后创建表单数据,代码如下,通过创建的第三张表单,里面的​​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)

→ 输出的结果为:(三张表单已经创建完毕)

【爬虫高阶】Mysql数据库表单多对多数据的增添删改及查询_表单数据_02

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表单,这个就是创建第三张表,将之前的表单通过中转站链接在一起了)

【爬虫高阶】Mysql数据库表单多对多数据的增添删改及查询_数据库_03

3. 多对多删除数据

这里采用查询删除的方式进行删除数据,也就是四依据某些条件来删除数据,代码如下

u = session.query(User).filter(User.id==3).first()
session.delete(u)
session.commit()

→ 输出的结果为:(这里的id是3,删除后如果再添加数据的话,id就从4开始)

【爬虫高阶】Mysql数据库表单多对多数据的增添删改及查询_mysql_04

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,实现了多对多表单数据的修改)

【爬虫高阶】Mysql数据库表单多对多数据的增添删改及查询_mysql_05

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)

→ 输出的结果为:(这里就是使用正则表达式进行匹配数据)

张三


举报

相关推荐

0 条评论