2009-08-23 5 views
3

Ich verwende SQLobject und war bisher nicht in der Lage eine elegante Lösung für „update Zeile in den db oder erstellen Sie einen neuen zu finden, wenn es nicht existiertWie create_or_update in sqlobject? Ich verwende folgende etwas gewundenen Code

Derzeit:.

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) 

Offensichtlich ist dies bei weitem nicht bening consise, robust, elegant oder schnell. Was ist der richtige Weg (TM), dies zu tun?

Antwort

1

ich weiß nicht, von einer besonderen Art und Weise, es zu tun , wenn Sie wirklich nicht im Voraus wissen, ob es sich um ein Create oder ein Update handelt te. Es gibt sicherlich keine spezielle SQL-Syntax, die dies effizient ausführen kann (*), so dass jede bereitgestellte Implementierung im Wesentlichen dasselbe tun würde wie Ihr Code.

(naja, MySQL hat die ON DUPLICATE KEY UPDATE- und REPLACE-Mechanismen, aber sie lösen bei jeder UNIQUE-Schlüsselübereinstimmung nicht nur den Primärschlüssel aus, was ein bisschen gefährlich sein kann und Oracle hat das Hässliche als Sünde MERGE-Anweisung, aber das sind nicht standardmäßige Erweiterungen, die SQLObject nicht wirklich verwenden kann.)

1

Es gibt keine Möglichkeit, dies in SQLObject mithilfe von High-Level-API zu tun. Sie können es mit SQLBuilder Update tun, verwenden Sie einfach undokumentierte Replace anstelle von Update.