我正在使用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
。
答案 0 :(得分:6)
Person.save(force_insert=True)
答案 1 :(得分:1)
I think you might try get_or_create()? http://peewee.readthedocs.org/en/latest/peewee/querying.html#get-or-create
答案 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的多用户数据库。