3

我正在使用SQLobject,到目前为止还没有找到一个优雅的解决方案来解决“更新数据库中的行或创建一个新行(如果它不存在)”。

目前我使用以下有些复杂的代码:

args = dict(artnr=artnr, name=name, hersteller='?', hersteller_name='?')
if cs.datamart.ArtNrNameHersteller.selectBy(artnr=artnr).count():
    row = cs.datamart.ArtNrNameHersteller.selectBy(artnr=artnr)[0]
    row.set(**args)
else:
    cs.datamart.ArtNrNameHersteller(**args)

显然,这远非简洁、健壮、优雅或快速。这样做的正确方法(TM)是什么?

4

2 回答 2

1

当您真的事先不知道它是创建还是更新时,我不知道有什么特殊的方法可以做到这一点。当然没有特殊的 SQL 语法可以有效地执行此操作(*),因此提供的任何实现基本上都与您的代码执行相同的操作。

(*: 嗯,MySQL 有 ON DUPLICATE KEY UPDATE 和 REPLACE 机制,但它们触发任何唯一键匹配,而不仅仅是主键,这可能有点危险;而 Oracle 有丑陋的 MERGE 语句。但是这些是 SQLObject 不能真正使用的非标准扩展。)

于 2009-08-23T09:38:35.867 回答
1

使用高级 API 在 SQLObject 中无法做到这一点。您可以使用 SQLBuilder 的Update来完成,只需使用 undocumentedReplace而不是Update.

于 2017-05-19T21:37:03.837 回答