如何在sqlobject中实现create_or_update?
我正在使用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其实用不了。)