三十八:数据库之ORM层面删除数据的注意事项

准备工作

from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKeyfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmaker, relationship, backref

# 数据库信息host = ‘127.0.0.1‘port = ‘3306‘database = ‘db_to_sqlalchemy‘username = ‘root‘password = ‘123456‘

# 数据库类型+连接数据库的插件,这里使用的pymysqlDB_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()

原文地址:https://www.cnblogs.com/zhongyehai/p/11816432.html

时间: 2024-07-30 01:21:49

三十八:数据库之ORM层面删除数据的注意事项的相关文章

sqlalchemy orm 层面删除数据注意

#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,relationship,backref from random import r

程序员的奋斗史(三十八)——大学断代史(二)——我与数据库的故事

文/.温国兵 惰性人皆有之,也算是人的一大天性.几日之前便构思好此文,怎奈每日杂事繁多,今日才提起笔,作下此文.本文谈谈我与数据库的故事. 说起和数据库结缘,还得从大一说起.大一刚开始接触C语言,每日就沉浸在无止境的代码中.在网上查资料的过程中,看到别人用C语言写了一个小型的图书操作程序,数据库采用的是SQL Server,运行出来的效果图很炫,惊叹原来还可以这样管理数据.熟知C语言的同学肯定对文件操作不陌生,当时我们写程序如果有静态数据,都是放在文件里的.直到后来做的C语言课程设计,我也是一大

QT开发(三十八)——Model/View框架编程

QT开发(三十八)--Model/View框架编程 一.自定义模型 1.自定义只读模型 QAbstractItemModel为自定义模型提供了一个足够灵活的接口,能够支持数据源的层次结构,能够对数据进行增删改操作,还能够支持拖放.QT提供了 QAbstarctListModel和QAbstractTableModel两个类来简化非层次数据模型的开发,适合于结合列表和表格使用. 自定义模型需要考虑模型管理的的数据结构适合的视图的显示方式.如果模型的数据仅仅用于列表或表格的显示,那么可以使用QAbs

NeHe OpenGL教程 第三十八课:资源文件

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十八课:资源文件 从资源文件中载入图像: 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用. 欢迎来到NeHe教程第38课.离上节课的写作已经有些时日了,加上写了一整天的code,也许笔头已经

三十八、git merge简介

git merge的基本用法为把一个分支或或某个commit的修改合并现在的分支上. 我们可以运行git merge -h查看其命令usage: git merge [options] [<commit>...]    or: git merge [options] <msg> HEAD <commit>    or: git merge --abort -n                    do not show a diffstat at the end of

&nbsp; CCNA实验三十八 ZFW(区域防火墙)

CCNA实验三十八 ZFW(区域防火墙) 环境:Windows XP .Packet Tracert5.3 目的:了解ZFW的原理与基本配置 说明: ZFW(Zone-Based Policy Firewall),是一种基于区域的防火墙,基于区域的防火墙配置的防火墙策略都是在数据从一个区域发到另外一个区域时才生效,在同一个区域内的数据是不会应用任何策略的,所以我们就可以将需要使用策略的接口划入不同的区域,这样就可以应用我们想要的策略.但是,有时某些接口之间可能不需要彼此使用策略,那么这样的接口只

微信小程序把玩(三十八)获取设备信息 API

原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx.onAccelerometerChange, 罗盘数据wx.onCompassChange wxml <button type="primary" bindtap="getNetWorkType">获取网络类型</button> <butt

第三十八象 辛丑

第三十八象 辛丑 谶 曰门外一鹿 群雄争逐劫及鸢鱼 水深火热 颂 曰火运开时祸蔓延万人後死万人先海波能使江河浊境外何殊在目前 金圣叹注解:此象兵祸起於门外有延及门内之兆 推背图网解:第三十八象应卦噬嗑.噬嗑形同张开利牙的大嘴撕扯肉食,用现在的话讲好比是一台正在工作的绞肉机.易曰:“雷电噬嗑,先王以明罚敕法.”噬嗑卦上雷下日.雷电大作,是要降妖除魔:先王严明刑罚,是为整饬法令.卜到此卦,令妖魔鬼怪胆寒,然而前景却是一片光明. 谶辞:门外一鹿何来群雄争逐?所谓门外,此处为大陆之外,即海中.鹿者,山麓

从零开始学android&lt;数据存储(4)Sqlite数据库存储.三十八.&gt;

从前几章我们分别学习了属性文件存储输数据,内储存存储数据,和外部储存存储数据,今天我们来学习一下android 轻量级数据库Sqlite数据库的数据存储 首先必须了解SQLiteOpenHelper SQLiteDatabase类本身只是一个数据库的操作类,但是如果要想进行数据库的操作,还需要一个android.database.sqlite.SQLiteOpenHelper类帮助下才可以取得进行,但是,SQLiteOpenHelper类是一个抽象类,所以要使用的时候需要定义其子类,并且在子类中