2009-04-02 19 views

Antwort

4

Ich glaube nicht, (korrigiert mich wenn ich falsch liege) INSERT OR REPLACE in einem der SQL-Standards ist; Es ist eine SQLite-spezifische Sache. Es gibt MERGE, aber das wird auch nicht von allen Dialekten unterstützt. Daher ist es in SQLAlchemys allgemeinem Dialekt nicht verfügbar.

Die sauberste Lösung ist Session zu verwenden, wie von M. Utku vorgeschlagen. Sie können auch SAVEPOINTs verwenden, um zu speichern, versuchen Sie: ein Einfügen, außer IntegrityError: dann Rollback und führen Sie stattdessen ein Update. Eine dritte Lösung besteht darin, INSERT mit einem OUTER JOIN und einer WHERE-Klausel zu schreiben, die die Zeilen mit Nullen filtert.

6
Session.save_or_update(model) 
+0

Das ist nicht mein Fall. Ich benutze keine Sitzung, ich verwende Connection direkt, also muss es mit SQL Ausdruck Sprache und conn.execute (...) getan werden – honzas

+2

Wie auch immer, das ist 0,4 SQLA spezifisch, für 0,5 müssen Sie Session.add verwenden (Modell) – Jiri

8

Was ist mit Session.merge?

Kopieren Sie den Status eine Instanz auf die persistente Instanz mit dem gleichen Bezeichner.

Wenn derzeit keine dauerhafte Instanz mit der Sitzung verknüpft ist, wird sie geladen. Gibt die persistente Instanz zurück. Wenn die angegebene Instanz nicht gespeichert ist, speichern Sie eine Kopie von und geben Sie sie als neu persistente Instanz zurück. Die angegebene Instanz wird nicht mit der Sitzung verknüpft. Diese Operation kaskadiert zu verknüpften Instanzen, wenn die Zuordnung mit cascade = "merge" zugeordnet ist.

von http://www.sqlalchemy.org/docs/reference/orm/sessions.html

1

Sie OR REPLACE als sogenannte prefix in Ihrem SQLAlchemy Insert verwenden können - die Dokumentation, wie OR REPLACE zwischen INSERT und INTO in Ihrer SQL-Anweisung zu platzieren ist here

+0

Dies ist ähnlich [diese Antwort] (http://stackoverflow.com/questions/2218304/sqlalchemy-insert-ignore/2224729#2224729). –