Как сделать create_or_update в sqlobject? - PullRequest
3 голосов
/ 23 августа 2009

Я использую 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 голос
/ 20 мая 2017

Нет способа сделать это в SQLObject, используя высокоуровневый API. Вы можете сделать это, используя SQLBuilder Update , просто используйте недокументированный Replace вместо Update.

1 голос
/ 23 августа 2009

Я не знаю какого-либо особого способа сделать это, когда вы действительно не знаете заранее, является ли это созданием или обновлением. Конечно, нет специального синтаксиса SQL, который мог бы сделать это эффективно (*), поэтому любая предоставленная реализация по существу будет делать то же самое, что и ваш код.

(*: ну, в MySQL есть механизмы ON DUPLICATE KEY UPDATE и REPLACE, но они запускаются при любом совпадении UNIQUE-ключа, а не только с первичным ключом, что может быть немного опасно; а в Oracle есть MERGE безобразно как грех Заявление. Но это нестандартные расширения, которые SQLObject не может использовать.)

...