This source detalles sobre cómo usar los proxies de asociación para crear vistas y objetos con valores de un objeto ORM.Proxy de asociación SQLAlchemy
Sin embargo, cuando anexo un valor que coincide con un objeto existente en la base de datos (y dicho valor es único o una clave principal), crea un objeto en conflicto por lo que no puedo confirmarlo.
Así que, en mi caso, esto solo es útil como una vista, y tendré que usar consultas ORM para recuperar el objeto que se va a anexar.
¿Esta es mi única opción? ¿Puedo usar merge? (Solo puedo hacer esto si es una clave principal y no una restricción única), O configuro el constructor de manera que use un objeto existente en el base de datos si existe en lugar de crear un nuevo objeto?
por ejemplo, de los documentos:
user.keywords.append('cheese inspector')
# Is translated by the association proxy into the operation:
user.kw.append(Keyword('cheese inspector'))
Pero me gustaría ser traducido a algo más parecido a: (por supuesto, la consulta podría fallar).
keyword = session.query(Keyword).filter(Keyword.keyword == 'cheese inspector').one()
user.kw.append(keyword)
o idealmente
user.kw.append(Keyword('cheese inspector'))
session.merge() # retrieves identical object from the database, or keeps new one
session.commit() # success!
supongo que esto puede incluso no ser una buena idea, pero podría ser en ciertos casos de uso :)
Creo que la respuesta está mostrando exactamente lo mismo que los documentos, pero los documentos a mostrar cómo hacerlo sin anulando varios métodos en la clase (supongo que eso es lo que los métodos están haciendo en la clase, no he verificado). Mi pregunta era más acerca de cómo cambiar el comportamiento de ese ejemplo para que sea más acorde con lo que quiero para mi caso de uso específico (no crear un nuevo objeto cada vez que anexo, sino usar uno existente de la base de datos si puede). –
@DerekLitz: lo suficientemente justo ... cambiará la respuesta para basarlo en la documentación vinculada a en su pregunta ... – van
Sí, ese método parece que funcionará, y es superior a simplemente definir un '__init__' que haría haga lo mismo, porque eso haría que todos los objetos tengan que ser instanciados de esa manera, o agregue alguna complejidad al método. Sin embargo, noté algunos errores, y es uno de los problemas del que no estaba muy seguro. ¿Cuál es la mejor manera de obtener la sesión para hacer la consulta antes de insertar?Su código tiene un error en la consulta, ya que debe hacerse con una sesión en el objeto, algo así como 'session.query (Keyword) .filter (Keyword.keyword = kw)'. –