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

1. 创建多对多的表单

每次进行新的操作之前,记得是清空之前test数据库中的内容,如下
在这里插入图片描述
然后创建表单数据,代码如下,通过创建的第三张表单,里面的user_idlanguage_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)

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

张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lys_828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值