日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

三十九:数据库之SQLAlchemy.relationship方法中的cascade参数

發(fā)布時間:2023/12/13 综合教程 21 生活家
生活随笔 收集整理的這篇文章主要介紹了 三十九:数据库之SQLAlchemy.relationship方法中的cascade参数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在SQLAlchemy中,只要將一條數(shù)據(jù)添加到session中,其它和此條數(shù)據(jù)相關(guān)聯(lián)的數(shù)據(jù)都會一起存到數(shù)據(jù)庫中,這是因為在relationship中有一個關(guān)鍵字參數(shù):cascade,默認(rèn)選項為save-update

一:save-update:默認(rèn)選項,在添加一條數(shù)據(jù)的時候,會把其他和次數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)都添加到數(shù)據(jù)庫中,這種行為就是save-update屬性決定的
二:delete:表示當(dāng)刪除某一個模型中的數(shù)據(jù)的時候,也刪除掉使用relationship和此數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)
三:delete-orphan:表示當(dāng)對一個ORM對象解除了父表中的關(guān)聯(lián)對象的時候,自己便會被刪除,如果父表的數(shù)據(jù)被刪除,同樣自己也會被刪除,這個選項只能用在一對多上,不能用在多對多和多對一上,并且使用的時候還需要在子模型的relationship中增加參數(shù):single_parent=True
四:merge(合并):默認(rèn)選項,當(dāng)在使用session.merge合并一個對象的時候,會將使用了relationship相關(guān)聯(lián)的對象也進(jìn)行merge操作
五:expunge:移除操作的時候,會將相關(guān)聯(lián)的對象也進(jìn)行移除,這個操作只是從session中移除,并不會正則從數(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)選項,在添加一條數(shù)據(jù)的時候,會把其他和次數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)都添加到數(shù)據(jù)庫中,這種行為就是save-update屬性決定的

將cascade的值設(shè)為空,則不會將模型關(guān)系映射成功

再看數(shù)據(jù)庫

手動設(shè)置為:save-update,關(guān)系映射成功

二:delete:表示當(dāng)刪除某一個模型中的數(shù)據(jù)的時候,也刪除掉使用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,此時對應(yīng)的user信息也會被刪除

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

同理,也可以在user表下做同樣設(shè)置

三:delete-orphan:表示當(dāng)對一個ORM對象解除了父表中的關(guān)聯(lián)對象的時候,自己便會被刪除,如果父表的數(shù)據(jù)被刪除,同樣自己也會被刪除,這個選項只能用在一對多上,不能用在多對多和多對一上,并且使用的時候還需要在子模型的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ù)會為空,由于設(shè)置了delete-orphan屬性,為空的數(shù)據(jù)會被刪除

四:merge(合并):默認(rèn)選項,當(dāng)在使用session.merge合并一個對象的時候,會將使用了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:移除操作的時候,會將相關(guān)聯(lián)的對象也進(jìn)行移除,這個操作只是從session中移除,并不會正則從數(shù)據(jù)庫刪除,與session.add

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

總結(jié)

以上是生活随笔為你收集整理的三十九:数据库之SQLAlchemy.relationship方法中的cascade参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。