如何在sqlobject中实现create_or_update?

3 投票
2 回答
537 浏览
提问于 2025-04-15 13:48

我正在使用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)是什么呢?

2 个回答

1

在SQLObject中,使用高级接口是无法做到这一点的。不过,你可以通过SQLBuilder的更新功能来实现,只需要用一个未记录的替换来代替更新就可以了。

1

我不知道有什么特别的方法来处理这种情况,特别是当你事先不知道是要创建还是更新的时候。确实没有什么特别的SQL语法可以高效地做到这一点,所以任何实现方式基本上都和你的代码是一样的。

(*: 当然,MySQL有ON DUPLICATE KEY UPDATE和REPLACE这两种机制,但它们会在任何唯一键匹配时触发,而不仅仅是主键,这样可能会有点危险;而Oracle则有个非常复杂的MERGE语句。不过这些都是非标准的扩展,SQLObject其实用不了。)

撰写回答