我正在使用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)才能做到这一点?
答案 0 :(得分:1)
我不知道有什么特别的方法,当你真的不知道它是创建还是更新时。当然没有特殊的SQL语法可以有效地执行此操作(*),因此提供的任何实现基本上都与您的代码相同。
(*:好吧,MySQL有ON DUPLICATE KEY UPDATE和REPLACE机制,但是它们在任何UNIQUE键上都会触发,而不仅仅是主键,这可能有点危险;而且Oracle有一个丑陋的罪恶MERGE但是这些是SQLObject无法真正使用的非标准扩展。)
答案 1 :(得分:1)
使用高级API在SQLObject中无法做到这一点。您可以使用SQLBuilder Update来完成,只需使用未记录的Replace
而不是Update
。