Как с помощью SQLAlchemy переключить два поля уникальной строки в рамках одного коммита?

Предположим, у вас есть объект с уникальным именем. Теперь вы хотите изменить имена двух объектов:

Вот макет:

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()

И я хотел бы сделать это:

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()

Это вызывает IntegrityError . Есть ли способ без этой ошибки переключить эти поля в одном коммите?

6
задан Philipp der Rautenberg 2 February 2012 в 09:41
поделиться