user3091850
user3091850

Reputation: 102

SQLAlchemy Versioned Object not working

I am using the SQLAlchemy versioned object example as a reference.

Example: http://docs.sqlalchemy.org/en/rel_0_7/orm/examples.html#versioned-objects

When I update a record I am getting no errors. The case_history table is being created, but the version number is staying at '1' and the case_history table is empty.

(Yes I am aware that I am using 'case' as a class name. Is that bad?)

Here are my code snippets:

models.py:

from history_meta import Versioned, versioned_session

# set up the base class
class Base(object):

    @declared_attr
    def __tablename__(cls):
            return cls.__name__.lower()

    id              = Column(Integer, primary_key = True)
    header_row      = Column(SmallInteger)

    def to_dict(self):
            serialized = dict((column_name, getattr(self, column_name))
                    for column_name in self.__table__.c.keys())
            return serialized

Base = declarative_base(cls=Base)

class case(Versioned, Base):

    title                   = Column(String(32))
    description             = Column(Text)

    def __repr__(self):
            return self.title

app.py:

engine = create_engine(SQLALCHEMY_DATABASE_URI)
Session = sessionmaker(bind=engine)
versioned_session(Session)
db = Session()

...

@app.route('/<name>/:record', method='POST')
def default(name, record):
    myClass = getattr(sys.modules[__name__], name)
    db.query(myClass).filter(myClass.id == record).update(request.json)

    for u in db.query(case).filter(case.id == record):
            print u.version # Version is always 1

    db.commit() # I added this just to test versioning.

Any clue as to why the versioning isn't happening?

Upvotes: 0

Views: 1104

Answers (2)

kruchone
kruchone

Reputation: 11

For others who find their way here...

Remember: even if filter() returns a single object, the update() method is a bulk operation, and acts differently. It is possible the version is only incremented on an event like after_update() which does not trigger on bulk operations.

Read more on caveats for the update() operation here.

Upvotes: 1

user3091850
user3091850

Reputation: 102

An update query will not cause the version to increment even though the data changes. There might be ways to 'listen' for that type of change, but I don't know.

You have to change an attribute of a mapped class:

#Get an instance of the class
myItem = db.query(myClass).get(record)

#Change an attribute
myItem.title="foo"

#Commit if necessary                 
db.commit()

Upvotes: 0

Related Questions