【爬虫高阶】Mysql数据库表单一对多创建以及数据的增添删改

1. 在python下设置关联表格

比如左侧的表格要与右侧的表格进行关联,这里就需要导入两个模块relationship和ForeignKey
在这里插入图片描述
为了防止在数据库中打开报错,先把之前创建的test数据库内容清空,重新创建一个test数据库,进行数据的录入
在这里插入图片描述
在python环境下创建关联表单的代码如下,一共分为五步,首先导入需要的模块,其次创建引擎,然后是继承基类设置一个表单,接着设置关联的表单,最后就是在引擎上创建设置好的两个表单

#一、 导入相关模块
from sqlalchemy import  create_engine,Column,String,Integer,ForeignKey
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()
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',
                           backref = 'user')
# 四、 设置第二个关联表单
class Language(Base):
    __tablename__ = 'language'
    id = Column(Integer(), primary_key = True, autoincrement = True)
    name = Column(String(125), nullable = True)
    advantage = Column(String(10), nullable = True)
    disadvantage = Column(String(10),nullable = True )
    user_id = Column(Integer(),ForeignKey('user.id'))

# 五、 在引擎上创建设置好的两个表单
Base.metadata.create_all(engine)

→ 输出的结果为:(在cmd里面重新将数据库转向到刚刚创建的test数据库,然后查看里面的表格)
在这里插入图片描述

2. 在关联表格中添加数据

2.1 一对一写入数据

和上一个博客中操作一样,因为已经创建了关联表单,在添加数据的时候就不需要再次执行创建表单的语句了,可以注释掉,然后在下面编写要添加到表单中的数据,采用上个博客的第三种方式进行数据的写入,如下

# 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 = u1
    session.add(L1)
    session.commit()

→ 输出的结果为:(user和language表单中就出现了设置好的内容)
在这里插入图片描述

2.2 一对多写入数据

接着上面的内容进行数据的添加,如下

u3 = User(name = '王五', gender = '女', town = '深圳')
u3.language = [
    Language(name = 'python',
             advantage = '开发快',
             disadvantage = '运行慢'),
    Language(name = 'c',
             advantage = '稳定',
             disadvantage = '上手慢')
]

session.add(u3)
session.commit()

→ 输出的结果为:(可以看到user中多了一个王五,然后在关联表单中多了两个language内容)
在这里插入图片描述

3. 在python下查找表单数据

上面的输出结果是通过cmd命令行进行表单数据的查看的,在python进行数据的查看,可以使用如下的代码

u = session.query(User).filter_by(id=3).first()#这里是输出1条,如果要输出全部的话就使用all
print("name:", u.name, u.gender)
lang = session.query(Language).filter_by(user_id = u.id)
for l in lang:
    print('language:',l.name, l.advantage,l.disadvantage)

→ 输出的结果为:(在pycharm输出框中可以看到对应的输出结果)
在这里插入图片描述

4. 在python下删除表单数据

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

→ 输出的结果为:(这种方式是可以把第一张表单中的数据删除的,但是其关联表单中的数据并没有删除,只是对应的user_id那里显示为null,这种情况下就很占用存储空间)
在这里插入图片描述
删除用户数据,其对应的关联数据也理所当然的应该被删除,这时候就需要添加一个参数,在关联表relationship语句中加上cascade参数,说明一下如果主表单被删除了,关联表单应该被怎么处理。

添加参数之后相当于改变了原来数据库的内容,这时候保证程序的正常运行,最好把创建的table表单清空,把刚刚的数据添加的过程重新运行一次,再进行数据删除的演示,如下
在这里插入图片描述
→ 输出的结果为:(这时候再运行一遍上面的删除用户的操作,结果发现已经删除了用户信息,和其对应的关联表单中的信息)
在这里插入图片描述

5. 在python下更新表单数据

注意上面的操纵已经删除了王五的数据,要再次进行更新的情况下,需要再次创建,那么自然而然再次创建的id就对应的为4,所以在进行更新数据的时候注意这里的id要对应上

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.name = '赵六'
session.commit()

→ 输出的结果为:(王五的名称已经被修改为赵六了)
在这里插入图片描述

6. 防错机制事件回滚

在操作中,难免会发生出错的现象,那么为了避免这种错误的操作对数据的修改,最好的方式就是将程序返回上一步,也就是回滚到还没有进行这部操作之前的数据库的状况,这样就可以大大提高程序的兼容性。使用的方式就是try-except的方式,如果出错,就执行rollback()方法进行程序的返回。

try;
    u1 = User(name = '张三', gender = '男', town = '北京')
    u2 = User(name = '李四', gender = '女', town = '上海')
    session.add_all([u1,u2])
    session.commit()
except:
    session.rollback()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lys_828

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

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

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

打赏作者

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

抵扣说明:

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

余额充值