Python peewee save() 没有按预期工作

Python peewee save() doesn't work as expected

我使用 Python 的 peewee ORM inserting/updating 将对象放入 MySQL 数据库。我有一个这样的模型:

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

我用循环创建 objects/rows,每次循环都有一个字典,如:

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 会根据需要执行更新或插入。

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

我想你可以试试 get_or_create()? http://peewee.readthedocs.org/en/latest/peewee/querying.html#get-or-create

Person.save(force_insert=True)

已记录:http://docs.peewee-orm.com/en/latest/peewee/models.html#non-integer-primary-keys-composite-keys-and-other-tricks

我有机会重新测试我的答案,我认为它应该被替换。这是我现在可以推荐的模式;首先,在模型上使用 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()

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