在python中插入或更新peewee记录

在python中插入或更新peewee记录,python,peewee,Python,Peewee,在Python中使用peewee是否有一种简单的单行方法,如果主键不存在,则插入一条记录;如果记录已经存在,则更新该记录 目前我正在使用代码: try: sql_database.create(record_key = record_key, record_data_2 = record_data_2) except IntegrityError: ## Occurs if primary_key already exists sql_database.update(recor

在Python中使用
peewee
是否有一种简单的单行方法,如果主键不存在,则插入一条记录;如果记录已经存在,则更新该记录

目前我正在使用代码:

try:
    sql_database.create(record_key = record_key, record_data_2 = record_data_2)
except IntegrityError:  ## Occurs if primary_key already exists
    sql_database.update(record_key = record_key, record_data_2 = record_data_2)

我看不到“创建或更新”命令,但可能缺少某些内容。

取决于数据库

对于SQLite和MySQL,Peewee3.x支持插入或替换。见文件:

对于Postgresql,Peewee3.x提供了对ON CONFLICT子句的完全支持。注意,您可以将“on_conflict”API与SQLite和MySQL一起使用——限制是它们不支持“UPDATE”操作。见文件:

示例:

# Works with SQLite and MySQL (which use "REPLACE")
result = (Emp
          .insert(first='mickey', last='dog', empno='1337')
          .on_conflict('replace')
          .execute())

# Works with Postgresql (which supports ON CONFLICT ... UPDATE).
result = (Emp
          .insert(first='foo', last='bar', empno='125')
          .on_conflict(
              conflict_target=(Emp.empno,),
              preserve=(Emp.first, Emp.last),
              update={Emp.empno: '125.1'})
          .execute())

您还可以使用
get\u或\u create
方法:

是否可以使用create\u或\u get,然后更改非关键元素(user.insert\u date=datetime.now),然后保存?我有时会出错..upsert的问题是不能使用REPLACE,例如,当记录上有insert\u date、update\u date等字段时。您不知道原始插入日期是否成功。请注意,peewee v3不再提供upsert。更新了答案和链接以反映这一点。感谢@coleifer,并感谢您更新答案以更好地反映新的peewee API。我说“peewee v3不提供upsert”的唯一一点是,作为一种方法,“upsert”似乎不再作为v3的一部分存在——这与v2不同。这是我唯一的观点。很抱歉我的沟通失误——我并不是说upsert作为一种功能在v3中不存在。Cheers注意冲突替换上的
将删除旧行并插入新行,这意味着该记录的id将更改。