Python peewee save()无法按预期工作

时间:2015-05-04 19:15:07

标签: python mysql upsert peewee

我正在使用peewee ORM for Python将对象插入/更新到MySQL数据库中。我有这样的模型:

class Person(Model):
    person_id = CharField(primary_key=True)
    name = CharField()

我用循环创建对象/行,每次循环都有一个字典,如:

pd = {"name":"Alice","person_id":"A123456"}

然后我尝试创建一个对象并保存它。

po = Person()
for key,value in pd.items():
    setattr(po,key,value)
po.save()

这需要一段时间才能执行,并且运行没有错误,但它不会向数据库保存任何内容 - 不会创建任何记录。

这有效:

Person.create(**pd)

但是当主键已经存在时,也会抛出错误(并终止脚本)。从阅读手册开始,我认为save()是我需要的功能 - 小便会根据需要执行更新或插入。

不确定我需要做什么 - 尝试先获取每条记录?如果无法创建记录错误并尝试更新记录?我是peewee的新手,通常会写INSERT ... ON DUPLICATE KEY UPDATE甚至REPLACE

3 个答案:

答案 0 :(得分:6)

答案 1 :(得分:1)

答案 2 :(得分:1)

我有机会重新测试我的答案,我认为应该更换。这是我现在可以推荐的模式;首先,在模型上使用get_or_create(),如果它不存在,将创建数据库行。然后,如果未创建(从db中检索对象),则从数据字典中设置所有属性并保存对象。

po, created = Person.get_or_create(person_id=pd["person_id"],defaults=pd)
if created is False:
    for key in pd:
        setattr(fa,key,pd[key])
    po.save()

和以前一样,我应该提到这些是两个不同的事务,所以这不应该用于需要在一个事务中进行真正upsert的多用户数据库。