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 sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> 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 sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to