gpt4 book ai didi

python - 如何在删除时将外键设置为默认值?

转载 作者:太空狗 更新时间:2023-10-30 00:41:36 26 4
gpt4 key购买 nike

如何在删除类别时自动将产品 category_id 设置为默认值?例如 1 指向第一个类别。

class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
content = db.Column(db.Text(), unique=True)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
atime = db.Column(db.DateTime())

def __init__(self, name, content, category_id):
self.name = name
self.content = content
self.category_id = category_id
self.atime = datetime.now()

def __repr__(self):
return '<Product %r>' % self.id

class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
products = db.relationship('Product', backref='category', cascade="all, delete, delete-orphan")

def __init__(self, *args, **kwargs):
if len(kwargs) > 0:
self.name = kwargs['name']

def __repr__(self):
return '<Category %r>' % self.name

我不想使用级联来删除它们!

最佳答案

这里编排需要做两件事:

  1. 通过适当的引用操作定义外键
  2. 配置SA关系的级联选项

我认为最干净的方法是在删除类别时将 category_id 设置为 NULL 值:SET NULL 是其中之一可能的Referential Actions ON DELETE 子句,您可以将其添加到 ForeignKey 中定义:

category_id = db.Column(db.Integer, db.ForeignKey('category.id', ondelete='SET NULL'))

以同样的方式,您可以使用一个选项 SET DEFAULT ,但在这种情况下,您还需要为 category_id 列配置默认值:category_id = Column(..., server_default=1)。请注意,这些实现在不同的 RDBMS 之间是不同的。

关于 cascade 选项:您基本上应该从 products 关系中删除 cascade="all, delete, delete-orphan"定义。事实上,您要确保 delete、delete-orphan 不存在。

话虽如此,您确实需要测试您的代码以涵盖不同的场景,因为 Category 对象的两次不同删除可能会产生不同的结果,具体取决于您的 RDBMS 和 SA 配置:

# scenario-1: delete in session: SA might set category_id of all chilren Products to None
c1 = session.query(Category).get(1)
session.delete(c1)
session.commit()

# scenario-2: delete without loading an object into the session: SA will perform no additional logic
session.query(Category).filter(Category.id == 2).delete()
session.commit()

希望所有这些都能为您指明正确的方向。像往常一样,使用 echo=True 在您的测试代码中启用 SQL 日志记录或者只是通过配置 logging 模块,您将看到 SA 对您的数据库做了什么。您在 SQL 中看不到的其他更改是由 RDBMS 本身根据您的引用操作完成的。

关于python - 如何在删除时将外键设置为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com