我使用的是peewee ORM,并且有一个带有复合非整数主键的表。密钥由时间戳和整数外键字段组成。示例表和相关模型如下所示。对于我正在使用的不同数据集,我有很多这样的表。
class fof2_site_hourly_manual(Base):
descriptor = TextField(null=True)
qualifier = TextField(null=True)
source = ForeignKeyField(db_column='source_id', rel_model=ionosonde)
valid_time = DateTimeField()
value = FloatField(null=True)
class Meta:
db_table = 'fof2_site_hourly_manual'
primary_key = CompositeKey('valid_time','source')
class ionosonde(Base):
name = TextField()
latitude = FloatField()
longitude = FloatField()
instrument_type = TextField()
class Meta:
db_table = 'ionosonde'
现在,我可以使用实例的save()方法或者class.insert()。execute()方法插入没有问题的行。
但是,我无法通过任何方式更新行。使用save()或class.update()。execute()我得到了重复的主键'错误。很好,当然有重复,这就是我尝试更新的原因。
情况变得更糟,我只是尝试使用class.get()检查一行时得到同样的错误。我可以使用select()来读取行。
这是peewee的一个已知限制吗?文档确实表明对复合主键的支持非常基础,但没有明确说明限制是什么。
编辑:这是迄今为止我尝试过的所有内容。我有要在字典中插入或更新行的产品的字段和值,让我们称之为数据。对于插入:
obj = class(**data)
obj.save(force_insert=True)
或
class.insert(**data).execute()
两个都工作。但是,如果该行已存在(主键与数据中的相关字段匹配),那么我已尝试
obj = class(**data)
obj.save()
和
class.update(**data).execute()
这最后一个可能不会起作用(没有where子句)但我已经考虑到了我所尝试的完整性。无奈之下,我试图实现一个select,delete然后插入循环,但是因为:
也失败了obj = class.get(**data)
和
obj = class.get_or_create(**data)
如果行存在,也会出现重复的键错误!那个真的烤了我的面条,我甚至都不想写信给DB!
我可以使用
读取现有数据query = class.select()
使用已知的主键字段构造where子句。
编辑:
哈!只是尝试使用select()来实例化给定行的对象,然后使用delete_instance()将其删除(然后使用更新的数据重新插入)。但是,它删除了表的全部内容!看起来peewee似乎不支持复合键,或者我做错了什么?