我有一个表,其中主键(id)不是我区分记录的键。为此,我有 3 列的唯一约束。为了能够合并记录,我添加了一个类方法,如果存在则检索相关记录,否则返回新记录。
class Foo(Base):
__table_args__ = (sa.UniqueConstraint('bar', 'baz', 'qux'),)
id = sa.Column(Identifier, sa.Sequence('%s_id_seq' % __tablename__), nullable=False, primary_key=True)
bar = sa.Column(sa.BigInteger)
baz = sa.Column(sa.BigInteger)
qux = sa.Column(sa.BigInteger)
a1 = sa.Column(sa.BigInteger)
a2 = sa.Column(sa.BigInteger)
@classmethod
def get(cls, bar=None, baz=None, qux=None, **kwargs):
item = session.query(cls).\
filter(cls.bar== bar).\
filter(cls.baz == baz).\
filter(cls.qux == qux).\
first()
if item:
for k, v in kwargs.iteritems():
if getattr(item, k) != v:
setattr(item, k, v)
else:
item = cls(bar=bar, baz=baz, qux=qux, **kwargs)
return item
这在大多数情况下都很好用,但每隔一段时间,我在尝试合并项目时都会收到一个完整性错误:
foo = Foo.get(**item)
session.merge(foo)
据我了解,发生这种情况是因为合并尝试在已经存在具有唯一字段的记录的位置插入记录。
功能有问题get
吗?我在这里想念什么?
(顺便说一句:我意识到这可能看起来很尴尬,但我需要一个唯一的顺序 ID,并且为了避免 DB 不支持非主键列上的序列的问题,我这样做了)
编辑 1: 将 orm.db 更改为 session 以便示例更清晰
编辑 2: 我让这个系统在多个平台上运行,似乎这只发生在 Ubuntu 之上的 mysql 中(其他平台是 RedHat 之上的 Oracle)。此外,以某种奇怪的方式,它更多地发生在特定的最终用户身上。关于 mysql,我尝试了 mysql 和 mysql+mysqldb 作为连接字符串,但都产生了这个错误。对于最终用户,这没有任何意义,我不知道该怎么做......关于mysql,