On Nov 8, 2011, at 4:11 PM, rivka wrote:
> Hi,
>
> I am using the new features of the recent 0.7.3 release for support
> for mutation tracking (section 2.10.3 in the documentation) verbatim -
> following the example in the documentation. So I have:
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.7b3-py2.6.egg/sqlalchemy/orm/
> session.py", line 1222, in merge
Before I try anything, this is 0.7b3. There were many bugs in that version.
Can you try the latest 0.7.3 ?
>
> Base = declarative_base()
>
> class JSONEncodedDict(TypeDecorator):
> "Represents an immutable structure as a json-encoded string."
> impl = VARCHAR
>
> def process_bind_param(self, value, dialect) :
> if value is not None:
> value = json.dumps(value)
> return value
>
> def process_result_value(self, value, dialect):
> if value is not None:
> value = json.loads(value)
> return value
>
>
>
> class MutationDict(Mutable, dict):
> @classmethod
>
> def coerce(cls, key, value):
> "Convert plain dictionaries to MutationDict."
>
> if not isinstance(value, MutationDict) :
> if isinstance(value, dict) :
> return MutationDict(value)
>
> ## this call will raise ValueError
> return Mutable.coerce(key, value)
> else :
> return value
>
> def __setitem__(self, key, value):
> "Detect dictionary set events and emit change events."
> dict.__setitem__(self, key, value)
> self.changed()
>
> def __delitem__(self, key):
> "Detect dictionary del events and emit change events."
> dict.__delitem__(self, key)
> self.changed()
>
> MutationDict.associate_with(JSONEncodedDict)
> ==============
> followed by a number of class / tables that use the JSONEncodedDict to
> pack dictionaries into the database:
>
> class PatentInfo(Base):
> """
> The main patent info table with references to the secondary tables
> """
> __tablename__ = "pat_info_main"
> ## id = Column(Integer, primary_key=True)
> pNum = Column(Integer, primary_key=True)
> pStatus = Column(String)
> pAppDate = Column(Integer)
> pPubDate = Column(Integer)
> pEC = Column(JSONEncodedDict)
> pTreeStats = Column(JSONEncodedDict)
>
> pBibInfo = relationship("BibInfo", backref="pat_info_main",
> uselist=False)
> pClassification = relationship("Classification",
> backref="pat_info_main", uselist=False)
> pCited = relationship('CitedInfo', backref="pat_info_main",
> uselist=False)
>
> def __init__(self, pDat):
> """PatentInfo Constructor"""
> if isinstance(pDat, PatentDatItem):
> self.pNum = pDat.pat_num
> self.pStatus = pDat.status
>
> etc.
>
> In the code I am merging newly acquired date into the databas:
>
> pat = PatentInfo(self.pDat)
> bib_dat = BibInfo(self.pDat.bib_dat)
> class_dat =
> Classification(self.pDat.bib_dat.classification)
> cite_dat = CitedInfo(self.pDat.cited)
> bib_dat.pat_info_main = pat
> class_dat.pat_info_main = pat
> cite_dat.pat_info_main = pat
>
> self.db.session.merge(pat)
>
> self.db.session.commit()
>
> =====
> In a number of cases where an actual merge takes place (as opposed to
> addition of new data) I got an error message as the following:
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "/var/folders/mp/mp8U9z96G784zzlU07ugOU+++TI/-Tmp-/
> Python485iEc.py", line 272, in <module>
> File "/var/folders/mp/mp8U9z96G784zzlU07ugOU+++TI/-Tmp-/
> Python485iEc.py", line 133, in Acquire
> File "ParseResponse.py", line 107, in ParseXML
> self.db.session.merge(pat)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.7b3-py2.6.egg/sqlalchemy/orm/
> session.py", line 1222, in merge
> load=load, _recursive=_recursive)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.7b3-py2.6.egg/sqlalchemy/orm/
> session.py", line 1314, in _merge
> load, _recursive)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.7b3-py2.6.egg/sqlalchemy/orm/
> properties.py", line 135, in merge
> impl.set(dest_state, dest_dict, value, None)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.7b3-py2.6.egg/sqlalchemy/orm/
> attributes.py", line 498, in set
> value, old, initiator)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.7b3-py2.6.egg/sqlalchemy/orm/
> attributes.py", line 504, in fire_replace_event
> value = fn(state, value, previous, initiator or self)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.7b3-py2.6.egg/sqlalchemy/ext/
> mutable.py", line 372, in set
> oldvalue._parents.pop(state.obj(), None)
> NameError: global name 'state' is not defined
>
> I tried to follow the errors to their source and it seems as if it is
> buried inside the source code for the sqlalchemy.
>
> I am using the most recent version: 0.7b3
>
> So - is that a real bug that needs fix of the source or something that
> I am doing wrong?
>
> Thanks,
>
> Rivka
>
>
> --
> 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.
>
--
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.