Hello,
I am puzzled by some behavior of is_modified() I am seeing.
Here is a sample program which illustrates the situation. I'm running
this on 0.6.4:
-----
import sqlalchemy
import sqlalchemy.orm
from sqlalchemy import Table, Column, Integer
class Spam(object):
def __init__(self, cans):
self.cans = cans
engine = sqlalchemy.create_engine('sqlite:///:memory:')
Session = sqlalchemy.orm.sessionmaker(autocommit=False, bind=engine)
session = Session()
meta = sqlalchemy.MetaData()
meta.bind = engine
spam_table = Table('spam', meta,
Column('id', Integer, primary_key=True),
Column('cans', Integer)
)
meta.create_all(engine)
sqlalchemy.orm.mapper(Spam, spam_table)
# Setup finished. Now test things out
instance = Spam(42)
session.add(instance)
session.commit()
print "Cans of spam = ", instance.cans
instance.cans = 42
print "Has instance been modified? (Should be False): ",
session.is_modified(instance)
session.commit()
instance.cans = 42
print "We have made no net change to the instance..."
print "Has instance been modified? (Should be False): ",
session.is_modified(instance)
-----
When I run this, I get:
-----
Cans of spam = 42
Has instance been modified? (Should be False): False
We have made no net change to the instance...
Has instance been modified? (Should be False): True
-----
That's surprising to me. In both cases, no net change is being made to
the instance.
Noodling around further, it appears that this is triggered by re-using
the same instance object, and doing another __setattr__ on the column
without having done a __getattr__ on it earlier. I suspect, without
having dug around, that after the commit, the instance's attribute
values are marked as needing to be re-loaded, but they are not being
re-loaded first in order to check whether the new value is in fact
different than the existing one.
I've also noticed if I re-obtain the instance via a query using .get()
on the primary key, the behavior is the expected one, again presumably
because the query operation is loading in all the column values.
Am I missing something here?
Ted
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.