Thread: [SQLObject] SQLObject, _perConnection & PicklingError
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Markos K. <mk...@gm...> - 2010-02-26 20:14:08
|
So, I had a class that had an internal _connection. When I tried to pickle it, I got errors, which from the looks of main were related to whether I had a per instance connection or went through sqlhub. So I rewrote the class & code as follows: connection = connectionForURI('mysql://%s:%s@%s:3306/%s?debug=1&use_unicode=1&charset=utf8' % (dbuser,dbpass,dbhost,dbname)) sqlhub.processConnection = connection class Title(SQLObject): class sqlmeta: fromDatabase = True books = MultipleJoin('Book') author = RelatedJoin('Author', intermediateTable='author_title',createRelatedTable=True) categorys = MultipleJoin('Category') kind = ForeignKey('Kind') listTheseKeys=('kind') but I'm still getting the same PicklingError. What can I be missing? I've seen a few recent posts about fixing this, but is there a workaround? Thank much --Marko /Users/mkapes/Downloads/infoshopkeeper/AmazonAuthorTitle.py in <module>() 40 except KeyError: 41 ourTitles=list(Title.select(RLIKE(Title.q.isbn, '^[0-9]{9}[0-9xX]{1}$') & (Title.q.kindID==1))) ---> 42 shelf['ourTitles']=ourTitles 43 44 /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/shelve.pyc in __setitem__(self, key, value) 130 f = StringIO() 131 p = Pickler(f, self._protocol) --> 132 p.dump(value) 133 self.dict[key] = f.getvalue() 134 /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/SQLObject-0.13dev_r4106-py2.6.egg/sqlobject/main.pyc in __getstate__(self) 1679 if self.sqlmeta._perConnection: 1680 from pickle import PicklingError -> 1681 raise PicklingError('Cannot pickle an SQLObject instance that has a per-instance connection') 1682 d = self.__dict__.copy() 1683 del d['sqlmeta'] PicklingError: Cannot pickle an SQLObject instance that has a per-instance connection > /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/SQLObject-0.13dev_r4106-py2.6.egg/sqlobject/main.py(1681)__getstate__() 1680 from pickle import PicklingError -> 1681 raise PicklingError('Cannot pickle an SQLObject instance that has a per-instance connection') 1682 d = self.__dict__.copy() |
From: Oleg B. <ph...@ph...> - 2010-02-26 20:42:38
|
On Fri, Feb 26, 2010 at 03:13:50PM -0500, Markos Kapes wrote: > So, I had a class that had an internal _connection. When I tried to pickle it, I got errors, which from the looks of main were related to whether I had a per instance connection or went through sqlhub. So I rewrote the class & code as follows: I haven't released the instance pickling code, it is still in the trunk. You are brave to use it! > connection = connectionForURI('mysql://%s:%s@%s:3306/%s?debug=1&use_unicode=1&charset=utf8' % (dbuser,dbpass,dbhost,dbname)) > sqlhub.processConnection = connection > > class Title(SQLObject): > class sqlmeta: > fromDatabase = True > books = MultipleJoin('Book') > author = RelatedJoin('Author', intermediateTable='author_title',createRelatedTable=True) > categorys = MultipleJoin('Category') > kind = ForeignKey('Kind') > listTheseKeys=('kind') > > but I'm still getting the same PicklingError. I'll look into it. > What can I be missing? I've seen a few recent posts about fixing this Fixing what? I cannot unpickle the exact per-instance connection, so I refuse to pickle it (and the SQLObject instance with it). Oleg. -- Oleg Broytman http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Oleg B. <ph...@ph...> - 2010-02-26 21:33:35
|
On Fri, Feb 26, 2010 at 11:42:28PM +0300, Oleg Broytman wrote: > > but I'm still getting the same PicklingError. > > I'll look into it. Ok, found it. .select() always passes a connection to .get() thus setting _perConnection flag. I added a test if get() or _init() is passed the same connection - do not set _perConnection flag. I added the test to all branches - 0.11, 0.12 and the trunk. Committed in the revisions 4107-4110. Will be in the next round of releases. Please report if it helps. Oleg. -- Oleg Broytman http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |