三十八:数据库之ORM层面删除数据的注意事项
2024-09-05 15:33:55
准备工作
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()
最新文章
- Canvas 实现图片剪切
- Mybatis Generator insert useGeneratedKeys keyProperty
- python学习-异常处理
- 5、清理mac缓存和关闭后台运行程序
- Tips9: Destroy( )函数中的 延迟摧毁 功能
- 超好玩!10款神奇的字符图案 &; 词汇云生成工具
- Select的深入应用(2)
- java如何判断字符串是否为空的方法
- Linux软连接和硬链接(摘录)
- Python学习笔记5-字符串、bool、数值操作和数组字典排序
- JQUERY UI DOWNLOAD
- 使用angular4和asp.net core 2 web api做个练习项目(一)
- 数据结构之【栈】+十进制转d进制(堆栈数组模拟)
- 【BZOJ4033】【HAOI2015】树上染色
- 从源码安装git
- 《团队作业》五小福团队作业--UNO-- LandingDay--降落
- EL有11个隐含对象
- Docker中安装elasticsearch6.7.1
- Windows终端工具_MobaXterm
- 设计模式のObserver Pattern(观察者模式)----行为模式
热门文章
- 生成大量插入语句,并将语句写入txt文件中
- 紫书 例题 10-11 UVa 11181(概率计算)
- HDU - 6393 Traffic Network in Numazu (基环树+树链剖分/LCA)
- 【51nod1672】区间交
- Java分级考试
- Idea 一个窗口打开多个项目
- [Linux系统] (4)脚本编程
- POJ 2299 Ultra-QuickSort (树状数组 &;&; 离散化)
- 论文阅读:FlowBlaze: Stateful Packet Processing in Hardware
- linux 文件目录介绍