Hi Mike,

Thanks for your help with my other problem. I have a couple of other 
questions / a wishlist:

Is there a declarative way to add foreign keys to the history table when 
using history_meta.py? In the app I'm making the user can view old versions 
of a document, and I want to make sure e.g. the user that created the old 
version can't be deleted while their old versions exist.

Finally, it would be nice if other attributes could be carried over to the 
history mapper. If they had a similar API, the history objects could be 
worked with (e.g. serialised to JSON) in the same way as the non-history 
objects. Perhaps this could be done by carrying over methods decorated with 
@declared_attr? Something like this (untested):

def test_history_relationships(self):
    class User(self.Base):
        __tablename__ = 'appuser'
        id = Column(Integer, primary_key=True)
        name = Column(String)

    class Document(Versioned, self.Base):
        __tablename__ = 'document'
        id = Column(Integer, primary_key=True)
        user_id = Column(Integer, ForeignKey("appuser.id"))
        contents = Column(String)

        @declared_attr
        def user(cls):
            return relationship(AppUser)

    self.create_tables()

    user = User(name="Fred")
    self.session.flush()

    document = Document(user_id=user.id)
    document.contents = "foo"
    self.session.flush()

    document.contents = "bar"
    self.session.flush()

    DocumentHistory = Document.__history_mapper__.class_
    v2 = self.session.query(Document).one()
    v1 = self.session.query(DocumentHistory).one()
    self.assertEqual(v2.user.name, "Fred")
    self.assertTrue(hasattr(v1, 'user'))
    self.assertEqual(v1.user.name, "Fred")

Although it would be nice if it worked with other attributes too, such as 
hybrid properties. Maybe they would need to be specially decorated for use 
only by the history mapper, so that relationships weren't made 
bidirectional.

Currently I'm doing this by manually querying the related tables - but I 
feel this is prone to error, because code for doing the join is duplicated. 
E.g. instead of doing *user_name = v1.user.name*, I do:

    user = self.session.query(User).filter_by(id=v1.user_id).one()
    user_name = user.name

I feel like I'm doing something wrong; any suggestions for improving this 
would be appreciated.

Cheers,
Alex

SQLAlchemy 1.0.8, Python 3, PostgreSQL 9.4

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to