On Fri, Oct 27, 2017 at 4:39 PM, <jens.troe...@gmail.com> wrote: > Thank you Mike! > > Yes, indeed you are right and I referred to Single Table Inheritance > <http://docs.sqlalchemy.org/en/latest/orm/inheritance.html#single-table-inheritance>! > I would like to version just one subclass, i.e. a subset of that single > table, and it sounds like that will work (source code link > <https://bitbucket.org/zzzeek/sqlalchemy/src/f7b957b589207cae98b6feec63be84ee6423c3ca/examples/versioned_history/test_versioning.py?at=master&fileviewer=file-view-default#test_versioning.py-449>, > though that example versions the base class). Great đź‘Ś > > And if I wanted to walk the versions of a particular row, how would I do > that? Suppose versioning in the example > <http://docs.sqlalchemy.org/en/latest/orm/inheritance.html#single-table-inheritance> > on Single Table Inheritance: > > # Versioned subclass. > class Engineer(Versioned, Employee): > engineer_info = Column(String(50)) > > # Retrieve a single Engineer object/row. > eng = session.query(Engineer).filter(Engineer.id==N).one_or_none() > # eng.version would give me the current version of the object/row. > # How can I iterate over previous versions of the object/row? > > If I read the history_meta.py > <https://bitbucket.org/zzzeek/sqlalchemy/src/f7b957b589207cae98b6feec63be84ee6423c3ca/examples/versioned_history/history_meta.py?fileviewer=file-view-default> > in > the example correctly, then versioned objects have a version > <https://bitbucket.org/zzzeek/sqlalchemy/src/f7b957b589207cae98b6feec63be84ee6423c3ca/examples/versioned_history/history_meta.py?at=master&fileviewer=file-view-default#history_meta.py-88> > and > a changed > <https://bitbucket.org/zzzeek/sqlalchemy/src/f7b957b589207cae98b6feec63be84ee6423c3ca/examples/versioned_history/history_meta.py?at=master&fileviewer=file-view-default#history_meta.py-95> > property, > but no property that is an iterator over previous versions. I'd have to > query a history table manually? >
the history table is mapped to a class attached to the versioned class: SomeClassHistory = SomeClass.__history_mapper__.class_ eq_( sess.query(SomeClassHistory).filter( SomeClassHistory.version == 1).all(), [SomeClassHistory(version=1, name='sc1')] ) you can add any kind of accessor on the versioned class to return that for you, like: def history_cls(cls): return cls.__history_mapper__.class_ hist = sess.query(MyClass.history_cls) or whatever you'd like. Or you can set this up within the history_meta routine itself, I'm not sure why I made it attach the "mapper" like that and not the class directly. > Would that be something like > > SELECT * FROM EngineerHistory WHERE id=N SORT BY version; -- > EmployeeHistory?? > > Cheers! > > > On Saturday, October 28, 2017 at 3:50:08 AM UTC+10, Mike Bayer wrote: >> >> On Thu, Oct 26, 2017 at 9:35 PM, <jens.t...@gmail.com> wrote: >> > Hello, >> > >> > I'm looking for a way track changes to table rows, very much like >> described >> > in this Stackoverflow question. >> > >> > SA supports versioning objects as described in the documentation: >> > http://docs.sqlalchemy.org/en/latest/orm/examples.html#versi >> oning-objects >> > Does this approach work for inherited classes as well? >> >> yes it does, there should be some coverage for joined inheritance in the >> tests. >> >> >> > I mean: can I version >> > a class which doesn't have a table but is a subclass of a joined table >> > inheritance? >> >> that would be single table inheritance if it doesn't have a table. >> the test suite has both a multilevel-joined test and a single >> inheritance test, doesn't seem to have tested joined inh to single but >> it's likely it will just work if you try it out. >> >> > Or will I need to version the base class which has the table >> > associated (something I'd like to avoid because I'd version much of >> what >> > would not need versioning). >> >> I'm not sure if the versioning example tries this but the Versioned >> mixin can be placed just on the class you care about versioning, and >> it's likely it will just take effect when that class is present. The >> Versioned mixin should be able to deal with each class independently >> of all the rest. You'd need to try it out and see what it does. >> >> >> >> > >> > Then there is SA Continuum, which seems more flexible but perhaps a >> little >> > too much for my needs. >> >> It's possible that Continuum was based on this example in the first >> place but I would never remember if that detail is real or just made >> up by my imagination. >> >> >> > With projects like Continuum I'm always a bit worried >> > about support and maintenance—any experiences with it? Does that >> support >> > table inheritance? >> >> You could reach out to its maintainer (the username that posts it to >> pypi, and /or the user that seems to have the most commits). If you >> don't get a reply, that's a clue :) >> >> >> >> >> > >> > Thanks! >> > Jens >> > >> > -- >> > SQLAlchemy - >> > The Python SQL Toolkit and Object Relational Mapper >> > >> > http://www.sqlalchemy.org/ >> > >> > To post example code, please provide an MCVE: Minimal, Complete, and >> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> > description. >> > --- >> > 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+...@googlegroups.com. >> > To post to this group, send email to sqlal...@googlegroups.com. >> > Visit this group at https://groups.google.com/group/sqlalchemy. >> > For more options, visit https://groups.google.com/d/optout. >> > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > 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 https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.