sqlalchemy 0.4.6 + python 2.3: many-to-many relation problem

43 views
Skip to first unread message

david.r...@googlemail.com

unread,
Jun 22, 2009, 12:43:37 PM6/22/09
to sqlalchemy
Hi

I've got a small problem with my python code proted from 0.5 (p2.5) to
0.4.6 (p2.3).
When I try to load query objects from many-to-many relation (mapped
via secondary keyword) I get most weird error:

Traceback (most recent call last):
File "<string>", line 86, in ?
File "X", line 17, in call_from_unix
File "X", line 12, in test
File "/usr/lib/python2.3/site-packages/SQLAlchemy-0.4.6-py2.3.egg/
sqlalchemy/orm/attributes.py", line 44, in __get__
return self.impl.get(instance._state)
File "/usr/lib/python2.3/site-packages/SQLAlchemy-0.4.6-py2.3.egg/
sqlalchemy/orm/attributes.py", line 281, in get
return self.set_committed_value(state, value)
File "/usr/lib/python2.3/site-packages/SQLAlchemy-0.4.6-py2.3.egg/
sqlalchemy/orm/attributes.py", line 635, in set_committed_value
collection.append_without_event(item)
File "/usr/lib/python2.3/site-packages/SQLAlchemy-0.4.6-py2.3.egg/
sqlalchemy/orm/collections.py", line 540, in append_without_event
getattr(self._data(), '_sa_appender')(item, _sa_initiator=False)
AttributeError: 'InstrumentedList' object has no attribute
'_sa_appender'

Any idea what is going on? It doesn't happen with sa > 0.5

Any help will be much appreciated
Cheers

The tables look like follows:
-------------------------------------------------------------------------------------------------------------------------
import sqlalchemy;
import sqlalchemy.orm;
import rfang.model.rfablcklstinstr;
import rfang.model.rfaruntime;

t_RfaEnvironment = None;
t_RfaEnvironment_RfaBlcklstInstr = None;

def initializeTable(metadata): #{{{
global t_RfaEnvironment;
global t_RfaEnvironment_RfaBlcklstInstr;
if(t_RfaEnvironment == None):
t_RfaEnvironment = sqlalchemy.Table("RuntimeConfigType",
metadata,
sqlalchemy.Column
("id",sqlalchemy.types.Integer,sqlalchemy.schema.Sequence
("id_RuntimeConfigType"),primary_key=True),
sqlalchemy.Column("name",sqlalchemy.types.Unicode
(10),nullable=False,unique=True),
sqlalchemy.Column("filename",sqlalchemy.types.Unicode
(100),nullable=False),
sqlalchemy.Column("filtername",sqlalchemy.types.Unicode
(255),nullable=False),
useexisting=True
);
rfang.model.rfablcklstinstr.initializeTable(metadata);
t_RfaEnvironment_RfaBlcklstInstr = sqlalchemy.Table
("RuntimeConfigType_Blacklist", metadata,
sqlalchemy.Column
("runtimeConfigType_id",sqlalchemy.types.Integer,sqlalchemy.ForeignKey
('RuntimeConfigType.id')),
sqlalchemy.Column
("blacklist_id",sqlalchemy.types.Integer,sqlalchemy.ForeignKey
('Blacklist.id')),
useexisting=True
);
return;
#def }}}

def initializeMapper(): #{{{
global t_RfaEnvironment;
global t_RfaEnvironment_RfaBlcklstInstr;
sqlalchemy.orm.mapper( RfaEnvironment, t_RfaEnvironment,
properties = {
"rfaruntimes" : sqlalchemy.orm.relation
(rfang.model.rfaruntime.RfaRuntime,backref="rfaenvironment",cascade="all,delete,delete-
orphan"),
"rfablacklist" : sqlalchemy.orm.relation
(rfang.model.rfablcklstinstr.RfaBlcklstInstr,secondary =
t_RfaEnvironment_RfaBlcklstInstr ,backref="rfaenvironments")
});
return;
#def }}}

class RfaEnvironment(object):

def __init__(self, name=None, filtername=None, filename=None,
rfaruntimes=[], rfablacklist=[]): #{{{2
self.name = name;
self.filename = filename;
self.filtername = filtername;
self.rfablacklist = rfablacklist;
self.rfaruntimes = rfaruntimes;
return;
#def }}}2

#class RuntimeConfigType
-------------------------------------------------------------------------------------------------------------------------
import sqlalchemy;
import sqlalchemy.orm;
import rfang.model.rfaenvironment;
import rfang.model.rfarun;

t_RfaSuite = None;
t_RfaSuite_RfaEnvironment = None;

def initializeTable(metadata): #{{{
global t_RfaSuite;
global t_RfaSuite_RfaEnvironment;
if(t_RfaSuite == None):
t_RfaSuite = sqlalchemy.Table("RfaSuite",metadata,
sqlalchemy.Column
("id",sqlalchemy.types.Integer,sqlalchemy.schema.Sequence
("id_RfaSuite"),primary_key=True),
sqlalchemy.Column("name",sqlalchemy.types.Unicode
(50),nullable=False),
useexisting=True
);
rfang.model.rfaenvironment.initializeTable(metadata);
t_RfaSuite_RfaEnvironment = sqlalchemy.Table
("RfaSuite_RuntimeConfigType",metadata,
sqlalchemy.Column
("RfaSuite_id",sqlalchemy.types.Integer,sqlalchemy.ForeignKey
("RfaSuite.id")),
sqlalchemy.Column
("RuntimeConfigType_id",sqlalchemy.types.Integer,sqlalchemy.ForeignKey
("RuntimeConfigType.id")),
useexisting=True
);
return;
#def }}}

def initializeMapper(): #{{{
global t_RfaSuite;
global t_RfaSuite_RfaEnvironment;
sqlalchemy.orm.mapper(RfaSuite, t_RfaSuite, properties = {
"rfaenvironments" : sqlalchemy.orm.relation
(rfang.model.rfaenvironment.RfaEnvironment,secondary=t_RfaSuite_RfaEnvironment,
backref="rfasuites"),
"rfaruns" : sqlalchemy.orm.relation
(rfang.model.rfarun.RfaRun,backref="rfasuite",cascade="all,delete,delete-
orphan",order_by=rfang.model.rfarun.t_RfaRun.c.id)
});
return;
#def }}}


class RfaSuite(object):

def __init__(self,name,rfaenvironments = [],rfaruns = []): #{{{2
self.name = name;
self.rfaenvironments = rfaenvironments;
self.rfaruns = rfaruns;
return;
#def }}}2

# class RfaSuite

Michael Bayer

unread,
Jun 22, 2009, 3:38:09 PM6/22/09
to sqlal...@googlegroups.com
that error would have something to do with pickling, direct __dict__
access on instances, or playing around with instrumentation extensions.
that's as much as can be said based on what you've given.

aside from whatever reasons for using Py2.3, why ever would you go
straight to 0.4.6 and not 0.4.8 ?

david.r...@googlemail.com

unread,
Jun 22, 2009, 3:58:30 PM6/22/09
to sqlalchemy
Hi

I'm a bit concerned why the same code works with SA 0.5. Actually when
there is no data in the relation, the query returns an empty list;
however, as soon as I put some data in, I got the error :O
I tried with 0.4.9dev...something as well, the same result though :/

Am missing the point here? Do all tables/mappers have to be defined in
the same context/module?

Thanks

On Jun 22, 8:38 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote:
> that error would have something to do with pickling, direct __dict__
> access on instances, or playing around with instrumentation extensions.  
>  that's as much as can be said based on what you've given.
>
> aside from whatever reasons for using Py2.3, why ever would you go
> straight to 0.4.6 and not 0.4.8 ?
>

Michael Bayer

unread,
Jun 22, 2009, 4:09:56 PM6/22/09
to sqlal...@googlegroups.com
david.r...@googlemail.com wrote:
>
> Hi
>
> I'm a bit concerned why the same code works with SA 0.5. Actually when
> there is no data in the relation, the query returns an empty list;
> however, as soon as I put some data in, I got the error :O
> I tried with 0.4.9dev...something as well, the same result though :/
>
> Am missing the point here? Do all tables/mappers have to be defined in
> the same context/module?

no. As I said, as far as what the stack trace indicates, you are doing
something with pickling, direct __dict__ access, or custom instrumentation
mods that is not compatible with 0.4. It might be something else too, but
none of the sample code you have provided provides any insight into what
might be causing the error. you would have to provide a succinct and
fully reproducing (read: we can run it here) test case in order to provide
more clues.

david.r...@googlemail.com

unread,
Jun 23, 2009, 5:26:16 AM6/23/09
to sqlalchemy
ha! got it! you were right, it's a vendor's python implementation
problem. the custom python runtime put an instrumentation layer on top
of other classes and that why it breaks :D
switched to the genuine python 2.3.5 and now it's fine :)

thanks for your input, as you pointed me in the right direction.

cheers Michael !

On Jun 22, 9:09 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote:

Michael Bayer

unread,
Jun 23, 2009, 10:50:21 AM6/23/09
to sqlal...@googlegroups.com
david.r...@googlemail.com wrote:
>
> ha! got it! you were right, it's a vendor's python implementation
> problem. the custom python runtime put an instrumentation layer on top
> of other classes and that why it breaks :D
> switched to the genuine python 2.3.5 and now it's fine :)

so....why not switch to genuine python 2.6 ? :)

david.r...@googlemail.com

unread,
Jun 23, 2009, 3:27:59 PM6/23/09
to sqlalchemy
no chance :( legacy third party C extension libraries :(
Reply all
Reply to author
Forward
0 new messages