[Sqlalchemy-tickets] Issue #2994: PickleType gets not updated in Database in some circumstances (zz
Brought to you by:
zzzeek
|
From: Marc S. <iss...@bi...> - 2014-03-17 15:26:21
|
New issue 2994: PickleType gets not updated in Database in some circumstances https://bitbucket.org/zzzeek/sqlalchemy/issue/2994/pickletype-gets-not-updated-in-database-in Marc Schlaich: Test: ``` #!python import logging logging.getLogger('sqlalchemy').setLevel(logging.INFO) logging.basicConfig() from sqlalchemy import create_engine, Column, Integer, PickleType from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Test(Base): __tablename__ = 'test' id = Column(Integer, primary_key=True) counters = Column(PickleType) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) def test_update_dict(): session = Session() session.add(Test(counters=[dict(counter=1)])) session.commit() t = session.query(Test).one() for d in t.counters: # it's obvious that this doesn't trigger a change in SQLA d['counter'] -= 1 # try to force a change in SQLAlchemy, this should issue a # update query t.counters = list(t.counters) session.commit() t = session.query(Test).one() assert t.counters == [dict(counter=0)] ``` Result: ``` #!python $ py.test sqla_test.py ============================= test session starts ============================= platform win32 -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2 plugins: cov collected 1 items / 1 skipped sqla_test.py F ================================== FAILURES =================================== ______________________________ test_update_dict _______________________________ def test_update_dict(): session = Session() session.add(Test(counters=[dict(counter=1)])) session.commit() t = session.query(Test).one() for d in t.counters: # it's obvious that this doesn't trigger a change in SQLA d['counter'] -= 1 # try to force a change in SQLAlchemy, this should issue a # update query t.counters = list(t.counters) print t.counters session.commit() t = session.query(Test).one() > assert t.counters == [dict(counter=0)] E assert [{'counter': 1}] == [{'counter': 0}] E At index 0 diff: {'counter': 1} != {'counter': 0} sqla_test.py:43: AssertionError ------------------------------- Captured stdout ------------------------------- [{'counter': 0}] ------------------------------- Captured stderr ------------------------------- INFO:sqlalchemy.orm.mapper.Mapper:(Test|test) _post_configure_properties() started INFO:sqlalchemy.orm.mapper.Mapper:(Test|test) initialize prop id INFO:sqlalchemy.orm.mapper.Mapper:(Test|test) initialize prop counters INFO:sqlalchemy.orm.mapper.Mapper:(Test|test) _post_configure_properties() complete INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit) INFO:sqlalchemy.engine.base.Engine:INSERT INTO test (counters) VALUES (?) INFO:sqlalchemy.engine.base.Engine:(<read-only buffer for 0x03971C50, size -1, offset 0 at 0x03913060>,) INFO:sqlalchemy.engine.base.Engine:COMMIT INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit) INFO:sqlalchemy.engine.base.Engine:SELECT test.id AS test_id, test.counters AS test_counters FROM test INFO:sqlalchemy.engine.base.Engine:() INFO:sqlalchemy.engine.base.Engine:COMMIT INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit) INFO:sqlalchemy.engine.base.Engine:SELECT test.id AS test_id, test.counters AS test_counters FROM test INFO:sqlalchemy.engine.base.Engine:() ===================== 1 failed, 1 skipped in 0.63 seconds ===================== ``` |