首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQLAlchemy删除父项既不删除子项也不设置子ForeignKey值为空

SQLAlchemy是一个Python的ORM(对象关系映射)工具,它提供了一种将关系数据库中的表和对象之间进行映射的方式。在SQLAlchemy中,删除父项时可以通过设置外键约束来实现不删除子项也不设置子ForeignKey值为空的需求。

具体实现方式如下:

  1. 首先,需要在父表和子表之间建立外键关系。在SQLAlchemy中,可以使用ForeignKey来定义外键关系,例如:
代码语言:python
代码运行次数:0
复制
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child", back_populates="parent")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship("Parent", back_populates="children")

在上述代码中,Parent表和Child表之间建立了一对多的关系,通过ForeignKey定义了parent_id作为外键。

  1. 接下来,可以使用SQLAlchemy的级联选项来设置删除父项时的行为。在这个问题中,我们需要设置为不删除子项也不设置子ForeignKey值为空。可以通过设置cascade参数为"save-update"来实现:
代码语言:python
代码运行次数:0
复制
from sqlalchemy import ForeignKeyConstraint

ForeignKeyConstraint(['id'], ['child.parent_id'], ondelete='SET NULL')

在上述代码中,通过ForeignKeyConstraint设置了当父项被删除时,将子项的parent_id设置为空。

综上所述,通过使用SQLAlchemy的外键关系和级联选项,可以实现删除父项既不删除子项也不设置子ForeignKey值为空的需求。

推荐的腾讯云相关产品:腾讯云数据库MySQL、腾讯云云服务器CVM。

腾讯云数据库MySQL产品介绍链接地址:https://cloud.tencent.com/product/cdb

腾讯云云服务器CVM产品介绍链接地址:https://cloud.tencent.com/product/cvm

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python Web - Flask笔记6

ORM层面删除数据注意事项 ORM代码删除数据时会无视数据表之间的约束,直接删除数据。然后将外键的数据设置NULL。就像约束SET NULL一样。...但是,如果数据设置nullable=False的时候,删除会报错。 ORM层面删除数据,会无视mysql级别的外键约束。直接会将对应的数据删除,然后将从表中的那个外键设置NULL。...删 delete-orphan:表示当对一个ORM对象解除了表中的关联对象的时候,自己便会被删除掉。当然如果表中的数据被删除,自己会被删除。...在写join的时候,如果写join的条件,那么默认将使用外键来作为条件连接。 query查找出来什么,不会取决于join后面的东西,而是取决于query方法中传了什么参数。...在查询中,将以后需要用到的字段通过label方法,取个别名。 3. 在查询中,如果想要使用查询的字段,那么可以通过查询的返回上的c属性拿到。

2K10
  • SqlAlchemy 2.0 中文文档(七十三)

    设置时,��A.b设置None删除A.ab。...即使一对多集合在关系模型中不能有重复,但使用序列集合的 ORM 映射的relationship()在内存中可以有重复,限制是此重复状态既不能持久化不能从数据库中检索。...设置时,将A.b设置None将同时删除A.ab。...即使一对多的集合在关系模型中不能有重复,在内存中使用序列集合的 ORM 映射的 relationship() 可以包含其中的重复,但限制是这种重复状态既不能持久化不能从数据库中检索。...尽管一对多集合在关系模型中不能有重复,但使用序列集合的 ORM 映射的relationship()在内存中可以有重复,但这些重复状态既不能持久化不能从数据库中检索。

    14410

    SqlAlchemy 2.0 中文文档(三十一)

    如果字典,则引发 KeyError。 method setdefault(*arg) 如果字典中没有键,则将键插入并将其设置默认。 如果字典中存在键,则返回键的,否则返回默认。...method clear() → None 从列表中删除所有。...如果字典,则引发 KeyError。 method setdefault(*arg) 如果键不在字典中,则将键插入并设置默认。 如果键在字典中,则返回键的,否则返回默认。...如果列表或索引超出范围,则引发 IndexError。 method remove(i: _T) → None 删除的第一个出现。 如果不存在,则引发 ValueError。...如果列表或索引超出范围,则引发 IndexError。 method remove(i: _T) → None 删除的第一个出现。 如果不存在,则引发 ValueError。

    25620

    Python Web - Flask笔记5

    Column常用参数 primary_key:设置某个字段为主键。 autoincrement:设置这个字段自动增长的。 default:设置某个字段的默认。在发表时间这些字段上面经常用。...nullable:指定某个字段是否。默认是True,就是可以为。 unique:指定某个字段的是否唯一。默认是False。...可以使用default设置初始默认 name:指定ORM模型中某个属性映射到表中的字段名。如果指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个作为参数。...RESTRICT:表数据被删除,会阻止删除。默认就是这一。 2. NO ACTION:在MySQL中,同RESTRICT。 3. CASCADE:级联删除删 4....SET NULL:表数据被删除,子表数据会设置NULL。

    1K10

    SqlAlchemy 2.0 中文文档(二十三)

    另请参阅 在 2.0 中弃用以删除的 cascade_backrefs 行为 - 关于“级联反向引用”行为变更的背景 ## 删除 delete级联表示当“”对象标记为删除时,其相关的“”对象应标记为删除...另请参阅 2.0 中将删除的 cascade_backrefs 行为已弃用 - 关于“级联反向引用”行为变更的背景信息 删除 删除级联表示当“”对象标记为删除时,其相关的“”对象应标记为删除。...删除删除孤儿级联的组合涵盖了 SQLAlchemy 需要在将外键列设置 NULL 与完全删除行之间做出决定的情况。...通常希望将“删除”级联配置双向。...删除孤立 delete-orphan 级联 delete 级联增加了行为,使得当对象与对象取消关联时,对象将被标记为删除,而不仅仅是当对象被标记为删除时。

    18610

    SqlAlchemy 2.0 中文文档(十五)

    subquery - 项目应该在加载时“急切”加载,使用一个额外的 SQL 语句,每个请求的集合发出一个 JOIN 到原始语句的查询。...相关集合将保持建议一般使用noload策略。对于一般的“永不加载”方法,请参见仅写关系。...passive_deletes=False - 指示删除操作期间的加载行为。 True 的表示在对象的删除操作期间不应加载未加载的子项目。...通常,当删除项目时,所有子项目都会加载,以便可以将它们标记为已删除,或者将它们的外键设置 NULL。...此外,将标志设置字符串“all”将禁用在对象被删除且未启用删除删除-孤儿级联时的“外键。当数据库端存在触发或错误提升方案时,通常会使用此选项。

    14110

    SQLAlchemy

    id = Column(Integer, primary_key=True) # 设置该字段为主键 # unique 设置唯一约束,nullable 设置约束 name = Column(String...Integer, primary_key=True) name = Column(String(64)) # ForeignKey 设置外键关联,第一个参数字符串,user 数据表名,id 字段名...# 第二个参数 ondelete 设置删除 User 实例后对关联的 Course 实例的处理规则 # 'CASCADE' 表示级联删除删除用户实例后,对应的课程实例会被连带删除 user_id...有个 query 方法用来查询数据,参数映射类的类名 # all 方法表示查询全部,这里可以省略写 # user 就是上一个函数 create_users 中的 user 对象 for user...,通过 relationship 设置 属性列表,里面是两个课程实例 In [9]: user.course Out[9]: [, <Course: 对于技术两个你们

    1K10

    SqlAlchemy 2.0 中文文档(八十)

    查询加载通常比较高效,用于加载许多较大的集合,因为它无条件地使用 INNER JOIN,而且不会重新加载行。...默认始终False。映射器选项将覆盖在 relationship()上指定的任何设置。通常应该为多对一、非外键关系设置���以允许改进的连接性能。...这是一种在第一个 SQL 查询之后立即发出第二个 SQL 查询的加载,该查询第一个查询中的所有加载完整集合,使用 INNER JOIN 向上连接到。...任何在 NOT NULLable 外键上的多对一关系设置此标志,类似地,任何保证存在相关的集合设置此标志。...查询加载通常更有效地加载许多较大的集合,因为它无条件地使用 INNER JOIN,而且不会重新加载行。

    15610

    Flask数据库过滤器与查询集

    ://root:root@127.0.0.1:3306/test' 设置每次请求结束后会自动提交数据中的更改,官方推荐设置 app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN...下面列出了一些常用选项: primary_key:如果设置True,这列就是表的主键 unique:如果设置True,这列不允许出现重复的 index:如果设置True,这列创建索引,提升查询效率...添加到address模型中person_id列被定义外键,就是这个外键建立起了联系。传给db.ForeignKey()的参数’person_id’表明,这一列的是person表中行的id。...层叠选项的默认能满足大多数情况的需求,但对这个多对多关系来说却不合用。删除对象时,默认的层叠行为是把对象联接的所有相关对象的外键设为。...但在关联表中,删除记录后正确的行为应该是把指向该记录的实体删除,因为这样能有效销毁联接。这就是层叠选项delete-orphan的作用。

    6.9K10

    SqlAlchemy 2.0 中文文档(三十二)

    将Bullet附加到Slide.bullets时,Bullet.position属性将保持未设置状态,直到手动分配。当Bullet插入列表中间时,后续的Bullet对象需要重新编号。...不支持或存在问题的操作包括: 两个条目必须交换。在主键或唯一约束的情况下,这不受直接支持,因为这意味着至少需要先暂时删除一行,或者在交换发生时将其更改为第三个中性。...如果列表或索引超出范围,则引发 IndexError。 method remove(entity) 移除第一次出现的。 如果不存在则引发 ValueError。...如果列表或索引超出范围,则引发 IndexError。 method remove(entity) 移除第一次出现的。 如果不存在,则引发 ValueError。...定义设置器 hybrid_property.setter()修饰符允许构造自定义的设置器方法,可以修改对象上的: class Interval(Base): # ...

    22310

    SqlAlchemy 2.0 中文文档(五十五)

    通过将create_engine.max_overflow设置“-1”,可以配置池具有无限的溢出。使用此设置,池仍然会维护一组固定的连接,但如果没有可用连接,则绝对会创建一个新连接,而不会阻塞。...在其他数据库中,查询命名仍然更清晰,以解决查询内部列名的任何歧义。 除了上述实际原因外,还有许多其他与 SQLAlchemy 相关的原因导致进行了更改。...SQLAlchemy 2.0 中已删除事务”模式,因此不再提供此特定编程模式,从而防止出现此错误消息。...可以通过将create_engine.max_overflow设置“-1”来配置池以具有无限溢出。...换句话说,它仅设计基于删除每个孤儿的一个且仅一个“”对象的创建,“”对象在一对多关系中的自然情况下导致“多”侧的相关项目随后被删除

    32210
    领券