Peewee 是否使用复合的非整数主键更新表中的行?

Peewee 是否使用复合的非整数主键更新表中的行?,peewee,Peewee,我正在使用peewee ORM,并且有一个具有复合、非整数主键的表。密钥由时间戳和整数外键字段组成。示例表和相关模型如下所示。我有很多这样的表,用于处理不同的数据集 class fof2_site_hourly_manual(Base): descriptor = TextField(null=True) qualifier = TextField(null=True) source = ForeignKeyField(db_column='source_id', rel

我正在使用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)

两者都有效。但是,如果行已经存在(主键与数据中的相关字段匹配),那么我尝试过

obj = class(**data)
obj.save()

最后一个可能不起作用(no where子句),但为了完整起见,我已将其包括在了中,以说明我所做的尝试。在绝望中,我尝试实现选择、删除然后插入循环,但也失败了,因为:

obj = class.get(**data)

如果行存在,也给出重复的键错误!那真是我的拿手好戏,我甚至不想给DB写信

我可以使用

query = class.select()
以及使用已知的主键字段构造where子句

编辑:


哈!!只需尝试使用select()为给定行实例化一个对象,然后使用delete_instance()将其删除(然后使用更新的数据重新插入)。但是,它删除了表的全部内容!看起来peewee真的不支持复合键,或者我做错了什么?

你能分享一下你用来发布
更新的代码吗?还有,你用的是什么版本?Peewee有一些与复合密钥相关的bug,这些bug是最近修复的。在任何情况下,您都可以尝试更新您的peewee。
obj = class.get(**data)
obj = class.get_or_create(**data)
query = class.select()