【发布时间】:2017-11-14 14:45:42
【问题描述】:
我想知道是否可以防止向数据库提交重复项。例如,假设有一个类如下
class Employee(Base):
id = Column(Integer, primary_key=True)
name = Column(String)
如果我要制作一系列这样的物品,
employee1 = Employee(name='bob')
employee2 = Employee(name='bob')
session.add_all([employee1, employee2])
session.commit()
我只想将一行添加到数据库中,并且employee1 和employee2 指向内存中的同一个对象(如果可能的话)。
SQLAlchemy 中是否有实现此功能的功能?或者我是否需要以编程方式确保不存在重复项?
【问题讨论】:
-
听起来您的主键错误。如果这是您想要的,您应该将名称作为主键。尽管那时人们不能真正更改名称而不引起巨大的多表数据库更新,因为各处的所有外键都必须更改。另外,如果您尝试将名称更改为现有名称,会发生什么?您是否只想清除已经存在的行?
-
按名称创建唯一索引,即使它不是主键,看起来也是强制名称唯一性的正确方法。
-
为了防止提交重复,请按照@9000 所说的做。要让会话在第二个示例中只创建一次 bob,请参阅 unique object recipes。
-
@nven - 除了阻止提交发生之外,数据库将如何解决问题?
-
理想情况下,我希望 ORM 能够意识到存在重复条目,只提交一个,并且对重复项的所有引用都引用同一个对象
标签: python sqlalchemy