Giả sử có một đối tượng có tên duy nhất. Bây giờ bạn muốn chuyển sang tên của hai đối tượng:Làm cách nào để chuyển đổi hai trường của một hàng duy nhất trong một lần commit bằng SQLAlchemy?
Dưới đây là cách bố trí:
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()
Và tôi muốn làm điều này:
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()
này ném một IntegrityError
. Có cách nào để chuyển đổi các trường này trong một lần commit mà không có lỗi này không?
Cảm ơn bạn. Thật vậy, nó có vẻ là một tài sản SQL cơ bản được truyền trực tiếp thông qua SQLAlchemy. Dưới đây là một liên kết đến một câu hỏi liên quan: http://stackoverflow.com/questions/644/swap-unique-indexed-column-values-in-database –
Đối với một số lý do tôi cũng đã phải thiết lập 'b.name' đến một giá trị ngẫu nhiên (bên cạnh 'a.name') bởi vì, trong một số trường hợp,' session.commit() 'thứ hai đã tăng một IntegrityError. – wil93
Đầu tiên cam kết có lẽ nên được một flush(), bởi vì nếu bạn vi phạm ACID ngữ nghĩa (thay đổi của bạn không phải là nguyên tử). –