三十八:数据库之ORM层面删除数据的注意事项
准备工作
from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref # 数据库信息
host = '127.0.0.1'
port = '3306'
database = 'db_to_sqlalchemy'
username = 'root'
password = '123456' # 数据库类型+连接数据库的插件,这里使用的pymysql
DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}' engine = create_engine(DB_URI) # 创建引擎
Base = declarative_base(engine) # 使用declarative_base创建基类
session = sessionmaker(engine)()
创建模型
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) def __repr__(self):
return f'User(username: {self.username})' class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
uid = Column(Integer, ForeignKey('user.id')) author = relationship('User', backref='article') def __repr__(self):
return f'Article(title: {self.title})' Base.metadata.drop_all() # 删除所有表
Base.metadata.create_all() # 创建表
插入数据
user = User(username='aaa')
article = Article(title='xxxxxxx')
article.author = user session.add(article)
session.commit()
写SQL删除user信息,报外键约束
使用sqlalchemy删除,成功
user = session.query(User).first()
session.delete(user)
session.commit()
可见,sqlalchemy删除时会将外键设置为null,所以为了使用外键约束,需在建表的时候,设置外键nullable=False,即不允许为空
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) def __repr__(self):
return f'User(username: {self.username})' class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
uid = Column(Integer, ForeignKey('user.id'), nullable=False) author = relationship('User', backref='article') def __repr__(self):
return f'Article(title: {self.title})' Base.metadata.drop_all() # 删除所有表
Base.metadata.create_all() # 创建表 user = User(username='aaa')
article = Article(title='xxxxxxx')
article.author = user session.add(article)
session.commit()
再次删除,就会报错
user = session.query(User).first()
session.delete(user)
session.commit()
三十八:数据库之ORM层面删除数据的注意事项的更多相关文章
- sqlalchemy orm 层面删除数据注意
#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- MongoDB数据库中更新与删除数据
MongoDB数据库中更新与删除数据 在MongoDB数据库中,可以使用Collection对象的update方法更新集合中的数据文档.使用方法如下所示: collection.update(sele ...
- python接口自动化(三十八)-python操作mysql数据库(详解)
简介 现在的招聘要求对QA人员的要求越来越高,测试的一些基础知识就不必说了,来说测试知识以外的,会不会一门或者多门开发与语言,能不能读懂代码,会不会Linux,会不会搭建测试系统,会不会常用的数据库, ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
随机推荐
- Python 3.8测试阶段正式开始,发布Beta 1版
上周,Python背后的团队宣布发布了Python 3.8.0b1 版本,这是Python 3.8计划的四个beta发行预览版中的第一个.此版本标志着beta阶段的开始,您可以在此阶段测试新特性,并使 ...
- deepin下挂载的的Windows系统(NTFC)目录怎么是只读的???
关键命令: df-h sudo ntfsfix /dev/sda4 重启 参考博客:深度官网问题之大神回复
- 架构师成长之路5.6-Saltstack配置管理(jinja模板)
点击架构师成长之路 架构师成长之路5.6-Saltstack配置管理(jinja模板) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要FU ...
- MXNetError: [05:53:50] src/operator/nn/./cudnn/cudnn_convolution-inl.h:287
insightface train.py 报错:mxnet.base.MXNetError: [05:53:50] src/operator/nn/./cudnn/cudnn_convolution- ...
- 关于scanf一个变量的覆盖问题
假如你为了省空间,在scanf一个很长的字符串s后,又重复scanf 字符串s, 但是后面的s比前面的s短,那么在s后面一定有没覆盖的原字符串的字符: 那么在取字符串长度时会不会还是原来的s长度而不是 ...
- HDU4456-Crowd (坐标旋转处理+hash处理+二维树状数组)
题意: 给出一个矩阵,初始每个位置上的值都为0,然后有两种操作 一种是更改某个位置上的值 另一种是求某个位置附近曼哈顿距离不大于K的所有位置的值的总和 技巧: 坐标旋转,使得操作之后菱形变成方方正正的 ...
- 利用docker 部署项目
docker_tomcat_jdk 7.0 1.6 app admin && api 1.yum install docker 2.service docker start 3.创建文 ...
- grunt的安装及使用
windows下安装grunt需要先安装ruby和nodejsruby -v 测试ruby是否安装成功node -v 测试nodejs是否安装成功npm -v 测试npm是否安装成功(npm是node ...
- SIM800c收发短信及AT指令
一.sim800设备安装 淘宝搜索sim800,差不多就是这么个样子 购买之后,安装手机卡,卡的缺口向外插入,会有卡住的感觉,再按一下卡会弹出 安装usb转串口驱动(CH340),设备的指示灯先是快闪 ...
- python获取网络图片
方式1 使用urllib库 import urllib.request import os ,stat url = "https://cn.bing.com/th?id=OHR.Lidong ...