三十九:数据库之SQLAlchemy.relationship方法中的cascade参数
在SQLAlchemy中,只要將一條數(shù)據(jù)添加到session中,其它和此條數(shù)據(jù)相關(guān)聯(lián)的數(shù)據(jù)都會(huì)一起存到數(shù)據(jù)庫中,這是因?yàn)樵趓elationship中有一個(gè)關(guān)鍵字參數(shù):cascade,默認(rèn)選項(xiàng)為save-update
一:save-update:默認(rèn)選項(xiàng),在添加一條數(shù)據(jù)的時(shí)候,會(huì)把其他和次數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)都添加到數(shù)據(jù)庫中,這種行為就是save-update屬性決定的
二:delete:表示當(dāng)刪除某一個(gè)模型中的數(shù)據(jù)的時(shí)候,也刪除掉使用relationship和此數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)
三:delete-orphan:表示當(dāng)對一個(gè)ORM對象解除了父表中的關(guān)聯(lián)對象的時(shí)候,自己便會(huì)被刪除,如果父表的數(shù)據(jù)被刪除,同樣自己也會(huì)被刪除,這個(gè)選項(xiàng)只能用在一對多上,不能用在多對多和多對一上,并且使用的時(shí)候還需要在子模型的relationship中增加參數(shù):single_parent=True
四:merge(合并):默認(rèn)選項(xiàng),當(dāng)在使用session.merge合并一個(gè)對象的時(shí)候,會(huì)將使用了relationship相關(guān)聯(lián)的對象也進(jìn)行merge操作
五:expunge:移除操作的時(shí)候,會(huì)將相關(guān)聯(lián)的對象也進(jìn)行移除,這個(gè)操作只是從session中移除,并不會(huì)正則從數(shù)據(jù)庫刪除
六:all:對 save-update、merge、refresh-expire、expunge、delete 這幾種的縮寫
準(zhǔn)備工作
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
# 數(shù)據(jù)庫信息
host = '127.0.0.1'
port = '3306'
database = 'db_to_sqlalchemy'
username = 'root'
password = '123456'
# 數(shù)據(jù)庫類型+連接數(shù)據(jù)庫的插件,這里使用的pymysql
DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'
engine = create_engine(DB_URI) # 創(chuàng)建引擎
Base = declarative_base(engine) # 使用declarative_base創(chuàng)建基類
session = sessionmaker(engine)()
使用默認(rèn)的cascade的值(不指定值),關(guān)系映射成功
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False)
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')
Base.metadata.drop_all() # 刪除所有表
Base.metadata.create_all() # 創(chuàng)建表
user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()
一:save-update:默認(rèn)選項(xiàng),在添加一條數(shù)據(jù)的時(shí)候,會(huì)把其他和次數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)都添加到數(shù)據(jù)庫中,這種行為就是save-update屬性決定的
將cascade的值設(shè)為空,則不會(huì)將模型關(guān)系映射成功
再看數(shù)據(jù)庫
手動(dòng)設(shè)置為:save-update,關(guān)系映射成功
二:delete:表示當(dāng)刪除某一個(gè)模型中的數(shù)據(jù)的時(shí)候,也刪除掉使用relationship和此數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False)
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', cascade='save-update,delete')
Base.metadata.drop_all() # 刪除所有表
Base.metadata.create_all() # 創(chuàng)建表
user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()
刪除article,此時(shí)對應(yīng)的user信息也會(huì)被刪除
article = session.query(Article).first()
session.delete(article)
session.commit()
同理,也可以在user表下做同樣設(shè)置
三:delete-orphan:表示當(dāng)對一個(gè)ORM對象解除了父表中的關(guān)聯(lián)對象的時(shí)候,自己便會(huì)被刪除,如果父表的數(shù)據(jù)被刪除,同樣自己也會(huì)被刪除,這個(gè)選項(xiàng)只能用在一對多上,不能用在多對多和多對一上,并且使用的時(shí)候還需要在子模型的relationship中增加參數(shù):single_parent=True,前提relationship的cascade需有delete屬性
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False)
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=backref('Article', cascade='save-update,delete,delete-orphan'),
cascade='save-update,delete', single_parent=True)
Base.metadata.drop_all() # 刪除所有表
Base.metadata.create_all() # 創(chuàng)建表
user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()
將user下的article置為空,則article表中的數(shù)據(jù)會(huì)為空,由于設(shè)置了delete-orphan屬性,為空的數(shù)據(jù)會(huì)被刪除
四:merge(合并):默認(rèn)選項(xiàng),當(dāng)在使用session.merge合并一個(gè)對象的時(shí)候,會(huì)將使用了relationship相關(guān)聯(lián)的對象也進(jìn)行merge操作
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False)
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=backref('article', cascade='save-update,delete,delete-orphan'),
cascade='save-update,delete', single_parent=True)
Base.metadata.drop_all() # 刪除所有表
Base.metadata.create_all() # 創(chuàng)建表
user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()
在模型關(guān)系中使用
五:expunge:移除操作的時(shí)候,會(huì)將相關(guān)聯(lián)的對象也進(jìn)行移除,這個(gè)操作只是從session中移除,并不會(huì)正則從數(shù)據(jù)庫刪除,與session.add
六:all:對 save-update、merge、refresh-expire、expunge、delete 這幾種的縮寫
總結(jié)
以上是生活随笔為你收集整理的三十九:数据库之SQLAlchemy.relationship方法中的cascade参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可剥夺与不可剥夺内核区别
- 下一篇: uniapp怎么调起摄像头拍视频_抖音视