三十九:數據庫之SQLAlchemy.relationship方法中的cascade參數


 

在SQLAlchemy中,只要將一條數據添加到session中,其它和此條數據相關聯的數據都會一起存到數據庫中,這是因為在relationship中有一個關鍵字參數:cascade,默認選項為save-update

一:save-update:默認選項,在添加一條數據的時候,會把其他和次數據關聯的數據都添加到數據庫中,這種行為就是save-update屬性決定的
二:delete:表示當刪除某一個模型中的數據的時候,也刪除掉使用relationship和此數據關聯的數據
三:delete-orphan:表示當對一個ORM對象解除了父表中的關聯對象的時候,自己便會被刪除,如果父表的數據被刪除,同樣自己也會被刪除,這個選項只能用在一對多上,不能用在多對多和多對一上,並且使用的時候還需要在子模型的relationship中增加參數:single_parent=True
四:merge(合並):默認選項,當在使用session.merge合並一個對象的時候,會將使用了relationship相關聯的對象也進行merge操作
五:expunge:移除操作的時候,會將相關聯的對象也進行移除,這個操作只是從session中移除,並不會正則從數據庫刪除
六:all:對 save-update、merge、refresh-expire、expunge、delete 這幾種的縮寫

 

准備工作

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)()

使用默認的cascade的值(不指定值),關系映射成功

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() # 創建表

user = User(username='aaa')
article = Article(title='title1')
article.author = user

session.add(article)
session.commit()

 

一:save-update:默認選項,在添加一條數據的時候,會把其他和次數據關聯的數據都添加到數據庫中,這種行為就是save-update屬性決定的

將cascade的值設為空,則不會將模型關系映射成功

再看數據庫

手動設置為:save-update,關系映射成功

 

二:delete:表示當刪除某一個模型中的數據的時候,也刪除掉使用relationship和此數據關聯的數據

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() # 創建表

user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()

刪除article,此時對應的user信息也會被刪除

article = session.query(Article).first()
session.delete(article)
session.commit()

同理,也可以在user表下做同樣設置

 

三:delete-orphan:表示當對一個ORM對象解除了父表中的關聯對象的時候,自己便會被刪除,如果父表的數據被刪除,同樣自己也會被刪除,這個選項只能用在一對多上,不能用在多對多和多對一上,並且使用的時候還需要在子模型的relationship中增加參數: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() # 創建表

user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()

將user下的article置為空,則article表中的數據會為空,由於設置了delete-orphan屬性,為空的數據會被刪除

 

四:merge(合並):默認選項,當在使用session.merge合並一個對象的時候,會將使用了relationship相關聯的對象也進行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() # 創建表

user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()

在模型關系中使用

 

五:expunge:移除操作的時候,會將相關聯的對象也進行移除,這個操作只是從session中移除,並不會正則從數據庫刪除,與session.add

 

六:all:對 save-update、merge、refresh-expire、expunge、delete 這幾種的縮寫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM