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

Mar*_*rch 4 python mysql upsert peewee

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

class Person(Model):
    person_id = CharField(primary_key=True)
    name = CharField()
Run Code Online (Sandbox Code Playgroud)

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

pd = {"name":"Alice","person_id":"A123456"}
Run Code Online (Sandbox Code Playgroud)

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

po = Person()
for key,value in pd.items():
    setattr(po,key,value)
po.save()
Run Code Online (Sandbox Code Playgroud)

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

这有效:

Person.create(**pd)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*rch 2

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

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()
Run Code Online (Sandbox Code Playgroud)

和之前一样,我应该提到这是两个不同的事务,因此不应将其用于需要在一个事务中进行真正的更新插入的多用户数据库。