Supongamos que tenemos un objeto con un nombre único. Ahora desea cambiar el nombre de los dos objetos:¿Cómo puedo cambiar dos campos de una fila única dentro de una confirmación usando SQLAlchemy?
Este es el diagrama:
import sqlalchemy as sa
import sqlalchemy.orm as orm
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyObject(Base):
__tablename__ = 'my_objects'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.Text, unique=True)
if __name__ == "__main__":
engine = sa.create_engine('sqlite:///:memory:', echo=True)
Session = orm.sessionmaker(bind=engine)
Base.metadata.create_all(engine)
session = Session()
y me gustaría hacer esto:
a = MyObject(name="Max")
b = MyObject(name="Moritz")
session.add_all([a, b])
session.commit()
# Now: switch names!
tmp = a.name
a.name = b.name
b.name = tmp
session.commit()
Esto arroja una IntegrityError
. ¿Hay alguna manera de cambiar estos campos dentro de una confirmación sin este error?
Gracias. De hecho, parece ser una propiedad SQL básica que se pasa directamente a través de SQLAlchemy. Aquí hay un enlace a una pregunta relacionada: http://stackoverflow.com/questions/644/swap-unique-indexed-column-values-in-database –
Por alguna razón, también tuve que establecer 'b.name' en valor aleatorio (además de 'a.name') porque, en algunos casos, el segundo' session.commit() 'generaba un IntegrityError. – wil93
El primer commit probablemente debería ser un flush(), porque de lo contrario violaría la semántica de ACID (su cambio no es atómico). –