首页 > 解决方案 > SQLAlchemy ORM:无效的集合

问题描述

我不明白为什么 SQLAlchemy 会给我以下警告:

SAWarning: This collection has been invalidated.
  util.warn("This collection has been invalidated.")

这是一个最小的例子:

import sqlalchemy
print(sqlalchemy.__version__)

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, ForeignKey

from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import relationship, sessionmaker

Base = declarative_base()

class ModelBase:

    @classmethod
    def create(cls, session, **kwargs):
        obj = cls(**kwargs)
        session.add(obj)
        session.commit()

        return obj

class User(ModelBase, Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)

    addresses = relationship("Address", order_by="Address.id", back_populates="user")

class Address(ModelBase, Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)

    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", back_populates="addresses")


engine = create_engine('sqlite:///:memory:', echo=False)
Base.metadata.create_all(engine)


Session = sessionmaker(bind=engine)
session = Session()

jack = User.create(session)
jack.addresses.append(Address.create(session))

警告在最后一行抛出。当我稍微重写代码时,警告消失了。

例如:

jack = User.create(session)
a = Address.create(session)
jack.addresses.append(a)

或者

jack = User.create(session)
jack.addresses = [Address.create(session)]

我可以使用 SQLAlchemy 1.3.18 和 1.4.0b1 重现此警告。

标签: pythonsqlalchemy

解决方案


推荐阅读