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

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

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

具体实现方式如下:

  1. 首先,需要在父表和子表之间建立外键关系。在SQLAlchemy中,可以使用ForeignKey来定义外键关系,例如:
代码语言:python
复制
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
复制
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属性拿到。

1.9K10

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。

7020

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 级联增加了行为,使得当对象与对象取消关联时,对象将被标记为删除,而不仅仅是当对象被标记为删除时。

6410

SqlAlchemy 2.0 中文文档(十五)

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

3810

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

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.8K10

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): # ...

8210

flask数据操纵

如果想在Flask中达到这样效果,需要安装一个第三方来支持。 SQLAlchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。...,代表表的主键 unique 如果True,代表这列不允许出现重复的 index 如果True,这列创建索引,提高查询效率 nullable 如果True,允许有空,如果False,不允许有空...default 这列定义默认 关系类型 选项 说明 backref 在关系的另一模型中添加反向引用 primary join 明确指定两个模型之间使用的联结条件 uselist 如果False...创建 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。...数据并不存在的字段 content = db.relationship('Acontent', backref='article', uselist=False) #一对一需要把uselist设置

1.3K10

Flask入门第三天

:如果True,代表表的主键 unique:如果True,代表这列不允许出现重复的 index:如果True,这列创建索引,提高查询效率 nullable:如果True,允许有空,如果False...,不允许有空 default:这列定义默认   2.4 常用的SQLALchemy关系选项 backref:在关系的另一模型中添加反向引用,用于设置外键名称,在1查多的 primary join:...在此文中,第一个参数对应参照的类"User" 第二个参数backref类User申明新属性的方法 第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据 如果设置查询方式(subquery...),则会在加载完Role对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢 设置 subquery 的话,role.users 返回所有数据列表 另外,可以设置动态方式...降级版本[删除表] python manage.py db downgrade   二、flask-session   允许设置session到指定存储的空间中。

2.7K20

flask-sqlalchemy 一对一,一对多,多对多操作

先进行如下操作: from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app=Flask(__name__) db=SQLAlchemy...c1.parent=p1 >>>c2.parent=p2 >>>db.session.add(p1) >>>db.session.add(p2) >>>db.session.commit() 此时数据被添加到数据库中了...p.name='p2'     #修改 >>>db.session.commit()     #修改成功,的确很方便 或者直接用一条语句: #直接查询出后修改,update采用字典修改{修要修改的列:'修改后的'...(c) >>>db.session.commit() 删除parent和删除child一样,不过删除parent后,child的外键变为(null)。...(Parent.name=='p1').first().children 或: >>>Parent.query.filter(Child.name=='c1').children 一对一: 一对一需要设置

3.5K50

Flask入门到放弃(四)—— 数据库

如果True,代表表的主键 unique 如果True,代表这列不允许出现重复的 index 如果True,这列创建索引,提高查询效率 nullable 如果True,允许有空,如果False...,不允许有空 default 这列定义默认 常用的SQLAlchemy关系选项 选项名 说明 backref 在关系的另一模型中添加反向引用,用于设置外键名称,在1查多的 primary join...第一个参数对应参照的类"Course" 第二个参数backref类Teacher申明新属性的方法 第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据 如果设置查询方式(subquery...另外,可以设置动态方式(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式 设置 dynamic 的话...['SESSION_PERMANENT'] = True # 如果设置True,则关闭浏览器session就失效。

3.1K20

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券