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

时间:2014-06-18 04:04:51

标签: peewee

我使用的是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似乎不支持复合键,或者我做错了什么?

0 个答案:

没有答案