2009-04-02 21 views

Respuesta

4

No creo (corríjanme si me equivoco) es insertar o sustituir en cualquiera de los estándares SQL; es algo específico de SQLite. Hay MERGE, pero eso tampoco es compatible con todos los dialectos. Por lo tanto, no está disponible en el dialecto general de SQLAlchemy.

La solución más limpia es usar Session, como lo sugiere M. Utku. También puede usar SAVEPOINTs para guardar, intente: un inserto, excepto IntegrityError: luego revertir y hacer una actualización en su lugar. Una tercera solución es escribir su INSERT con una cláusula OUTER JOIN y WHERE que filtre las filas con nulos.

6
Session.save_or_update(model) 
+0

Esta no es mi caso. No uso la sesión, estoy usando Connection directamente, por lo que debe hacerse usando el lenguaje de expresiones SQL y conn.execute (...) – honzas

+2

De todos modos, esto es 0.4 SQLA específico, para 0.5 debes usar Session.add (modelo) – Jiri

8

¿Qué hay de Session.merge?

Session.merge(instance, load=True, **kw) 

Copie el estado de una instancia en la instancia persistente con el mismo identificador.

Si no hay una instancia persistente actualmente asociada con la sesión, se cargará. Devuelve la instancia persistente. Si la instancia determinada no se ha guardado, guarde una copia y devuélvala como una instancia nueva persistente. La instancia dada no se asocia con la sesión. Esta operación se conecta en cascada a las instancias asociadas si la asociación se asigna con cascade = "merge".

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

1

Puede utilizar OR REPLACE como una llamada prefix en su SQLAlchemy Insert - la documentación de cómo colocar OR REPLACE entre INSERT y INTO en la instrucción SQL es here

+0

Esto es similar a [esta respuesta] (http://stackoverflow.com/questions/2218304/sqlalchemy-insert-ignore/2224729#2224729). –

Cuestiones relacionadas