Python全系列 教程
3567个小节阅读:5930.6k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在SQLAlchemy,只要将一个数据添加到session中,和他相关联的数据都可以一起存入到数据库中了。
这些是怎么设置的呢?其实是通过relationship的时候,有一个关键字参数cascade可以设置这些属性,
cascade属性值为:
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几种的缩写。
xxxxxxxxxx
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship,backref
from db_util import Base, Session
class User(Base):
__tablename__ = 't_user'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(32))
# articles = relationship('Article',backref='user',cascade='')
# articles = relationship('Article',backref='user',cascade='save-update') # 默认cascade的值是save-update
# articles = relationship('Article',backref='user',cascade='save-update,delete') # delete可以帮助删除关联表的数据
# articles = relationship('Article',backref='user',cascade='save-update,delete,delete-orphan',single_parent=True) # 当关联关系被解除时,子表数据会被清空
class Article(Base):
__tablename__ = 't_article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(32))
uid = Column(Integer, ForeignKey("t_user.id"))
# user = relationship('User',backref='articles',cascade='save-update,delete') # 会把主表的数据删除
user = relationship('User',backref=backref('articles',cascade='save-update,delete,delete-orphan'))
def create_data():
Base.metadata.drop_all() # 删除已有的表
Base.metadata.create_all() # 创建表
# 初始化数据
user = User(name='SXT')
art1 = Article(title='Python', uid=1)
art2 = Article(title='MySQL', uid=1)
user.articles.append(art1)
user.articles.append(art2)
# 保存数据
with Session() as ses:
ses.add(user)
ses.commit()
def delete_data():
with Session() as ses:
user = ses.query(User).first()
ses.delete(user)
ses.commit()
def delete_art():
with Session() as ses:
art = ses.query(Article).first()
ses.delete(art)
ses.commit()
def update_data():
with Session() as ses:
user = ses.query(User).first()
user.articles = []
ses.commit()
if __name__ == '__main__':
# create_data()
# delete_data()
# update_data()
delete_art()
实时学习反馈
1. 对SQLAlchemy中,关联表数据被删数据时,说法正确的是?
A 删除主表数据时,默认子表数据修改外键字段为Null
B 删除主表数据时,默认子表数据关联的数据会被删除
C 删除主表数据时,默认若子表有数据,则主表数据无法删除
D 删除子表数据时,默认主表被引用的数据也会被删除
答案
1=>A