corridor / sqlalchemy-history

Library to keep track of changes in SQLAlchemy.
Other
25 stars 24 forks source link

Association Proxy attributes causing issue for VersionedObject #114

Closed indiVar0508 closed 9 months ago

indiVar0508 commented 9 months ago

There seems to be a bug regarding association proxy for getting a attribute

from sqlalchemy import Column, ForeignKey, Integer, Unicode, UnicodeText, create_engine
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy_history import make_versioned

try:
    from sqlalchemy.orm import declarative_base
except ImportError:  # sqla < 2.x
    from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import configure_mappers, create_session, relationship

make_versioned(user_cls=None)
Base = declarative_base()

class Article(Base):
    __versioned__ = {}
    __tablename__ = "article"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Unicode(255))
    content = Column(UnicodeText)
    tag_name = association_proxy("tag", "name")

class Tag(Base):
    __versioned__ = {}
    __tablename__ = "tag"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Unicode)
    article_id = Column(Integer, ForeignKey("article.id"))
    article = relationship(Article, backref="tag")

configure_mappers()
engine = create_engine("sqlite://")
Base.metadata.create_all(engine)
session = create_session(bind=engine, autocommit=False)
article = Article(name="Some article", content="Some content", tag=[Tag(name="tag")])
session.add(article)
session.commit()
print(article.name)  # 'Some article'
print(article.tag_name)  # ["tag"]
print(article.versions[0].name)  # 'Some article'
print(article.versions[0].tag_name)  # TypeError: __get__() missing 1 required positional argument: 'owner'