在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 这几种的缩写

准备工作

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


from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKey<br></br>from sqlalchemy.ext.declarative import declarative_base<br></br>from sqlalchemy.orm import sessionmaker, relationship, backref<br></br><br></br># 数据库信息<br></br>host = '127.0.0.1'<br></br>port = '3306'<br></br>database = 'db_to_sqlalchemy'<br></br>username = 'root'<br></br>password = '123456'<br></br><br></br># 数据库类型+连接数据库的插件,这里使用的pymysql<br></br>DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'<br></br><br></br>engine = create_engine(DB_URI)  # 创建引擎<br></br>Base = declarative_base(engine)  # 使用declarative_base创建基类<br></br>session = sessionmaker(engine)()

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

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

class User(Base):<br></br>    __tablename__ = 'user'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    username = Column(String(50), nullable=False)<br></br><br></br><br></br>class Article(Base):<br></br>    __tablename__ = 'article'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    title = Column(String(50), nullable=False)<br></br>    uid = Column(Integer, ForeignKey('user.id'))<br></br>    author = relationship('User', backref='article')<br></br><br></br><br></br>Base.metadata.drop_all()  # 删除所有表<br></br>Base.metadata.create_all()  # 创建表<br></br><br></br>user = User(username='aaa')<br></br>article = Article(title='title1')<br></br>article.author = user<br></br><br></br>session.add(article)<br></br>session.commit()

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

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

一:save-update:默认选项,在添加一条数据的时候,会把其他和次数据关联的数据都添加到数据库中,这种行为就是save-update属性决定的

将cascade的值设为空,则不会将模型关系映射成功

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

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

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

再看数据库

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

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

手动设置为:save-update,关系映射成功

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

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

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

二:delete:表示当删除某一个模型中的数据的时候,也删除掉使用relationship和此数据关联的数据

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

class User(Base):<br></br>    __tablename__ = 'user'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    username = Column(String(50), nullable=False)<br></br><br></br><br></br>class Article(Base):<br></br>    __tablename__ = 'article'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    title = Column(String(50), nullable=False)<br></br>    uid = Column(Integer, ForeignKey('user.id'))<br></br>    author = relationship('User', backref='article', cascade='save-update,delete')<br></br><br></br><br></br>Base.metadata.drop_all()  # 删除所有表<br></br>Base.metadata.create_all()  # 创建表<br></br><br></br>user = User(username='aaa')<br></br>article = Article(title='title1')<br></br>article.author = user<br></br>session.add(article)<br></br>session.commit()

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

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

删除article,此时对应的user信息也会被删除

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

article = session.query(Article).first()<br></br>session.delete(article)<br></br>session.commit()

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

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

同理,也可以在user表下做同样设置

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

三:delete-orphan:表示当对一个ORM对象解除了父表中的关联对象的时候,自己便会被删除,如果父表的数据被删除,同样自己也会被删除,这个选项只能用在一对多上,不能用在多对多和多对一上,并且使用的时候还需要在子模型的relationship中增加参数:single\_parent=True,前提relationship的cascade需有delete属性

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

class User(Base):<br></br>    __tablename__ = 'user'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    username = Column(String(50), nullable=False)<br></br><br></br><br></br>class Article(Base):<br></br>    __tablename__ = 'article'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    title = Column(String(50), nullable=False)<br></br>    uid = Column(Integer, ForeignKey('user.id'))<br></br>    author = relationship('User', backref=backref('Article', cascade='save-update,delete,delete-orphan'),<br></br>                          cascade='save-update,delete', single_parent=True)<br></br><br></br><br></br>Base.metadata.drop_all()  # 删除所有表<br></br>Base.metadata.create_all()  # 创建表<br></br><br></br>user = User(username='aaa')<br></br>article = Article(title='title1')<br></br>article.author = user<br></br>session.add(article)<br></br>session.commit()

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

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

将user下的article置为空,则article表中的数据会为空,由于设置了delete-orphan属性,为空的数据会被删除

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

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

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

四:merge(合并):默认选项,当在使用session.merge合并一个对象的时候,会将使用了relationship相关联的对象也进行merge操作

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

class User(Base):<br></br>    __tablename__ = 'user'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    username = Column(String(50), nullable=False)<br></br><br></br><br></br>class Article(Base):<br></br>    __tablename__ = 'article'<br></br>    id = Column(Integer, primary_key=True, autoincrement=True)<br></br>    title = Column(String(50), nullable=False)<br></br>    uid = Column(Integer, ForeignKey('user.id'))<br></br>    author = relationship('User', backref=backref('article', cascade='save-update,delete,delete-orphan'),<br></br>                          cascade='save-update,delete', single_parent=True)<br></br><br></br><br></br>Base.metadata.drop_all()  # 删除所有表<br></br>Base.metadata.create_all()  # 创建表<br></br><br></br>user = User(username='aaa')<br></br>article = Article(title='title1')<br></br>article.author = user<br></br>session.add(article)<br></br>session.commit()

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

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

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

在模型关系中使用

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

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

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

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

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

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

五:expunge:移除操作的时候,会将相关联的对象也进行移除,这个操作只是从session中移除,并不会正则从数据库删除,与session.add

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

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

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

六:all:对 save-update、merge、refresh-expire、expunge、delete 这几种的缩写

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

标签: delete, Base, article, True, Column, __, SQLAlchemy, relationship, cascade

相关文章推荐

添加新评论,含*的栏目为必填