【发布时间】:2021-10-19 12:36:14
【问题描述】:
基本上我有一个从电子表格读取并插入数据库的服务。 在 SQLAlchemy 中我有以下关系
class Customer(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key=True)
name = Column(String)
children = relationship('Email', backref=('customer')
class Email(Base):
__tablename__ = 'emails'
id = Column(Integer, primary_key=True)
customer = Column(Integer, ForeignKey('customer.id'))
email = Column(String)
primary = Column(Boolean)
SQLAlchemy 是否可以检查获取的资源和在 ORM 中创建的资源之间的重复条目?
例如,假设客户 123 有一封电子邮件 some_email,我们尝试再次添加:
email_object = Email(customer=123, email='some_email', primary=True)
cust = connection.query(Customer).options(joinedload(Customer.emails)).filter_by(
id=123).first()
cust.emails.append(email_object)
理想情况下,我希望 SQLAlchemy 注意到这样的组合存在并合并/忽略它,或者抛出某种异常。
但是,如果我打印出cust.emails,则会得到以下结果
[<Email(id=1, email=some_email, primary=True, customer=123>),
<Email(customer=192071, email='some_email', primary=True, customers=<Employee(id=123, name='John', emails=['some_email', 'some_email']>>)]
并进行合并和提交似乎只是在数据库中添加了一个额外的相同行(pk 除外)。 我认为这可能与电子邮件中未使用的主键有关,但这是在提交到数据库时自动生成的。 有任何想法吗? 让我知道是否需要澄清任何事情。
【问题讨论】:
-
您的电子邮件对象可以使用 (customer, email) 作为其主键,而不是整数自动增量值。这样可以防止同一客户的电子邮件地址重复。
-
@GordThompson 您的意思是在数据库级别?这可以阻止数据被复制,但这意味着我只知道提交事务时它何时抛出。将 Email 类设置为具有两个主键似乎不会使 SQLAlchemy 停止将额外的电子邮件附加到
cust.emails。我应该使用其他操作吗?
标签: python sqlalchemy orm