the exception is in your constructor for User, you are trying to do len() on something that is probably None. There is an exception wrapper in Mapper that is obscuring that...as that wrapper has been creating more problems than its solving...I just committed a change without it (we'll have to figure some way to replace what it was doing in such a way that it doesnt blow away stack traces). if you SVN up you should get a clearer stack trace.

On Feb 27, 2006, at 9:23 PM, marek wrote:

I have tired to implement a many to many relationship from the online
documentation and the example attached in the previous Many to Many
thread but to no avail.

I am trying to following:

CREATE TABLE roles (
rl_id                   BIGSERIAL       NOT NULL PRIMARY KEY,
rl_name                 TEXT            NOT NULL,
rl_desc                 TEXT            NOT NULL,
UNIQUE(rl_name)
  ) WITHOUT OIDS;

CREATE TABLE users (
usr_id                  BIGSERIAL       NOT NULL PRIMARY KEY,
usr_logon               TEXT            NOT NULL,
usr_name                TEXT            NOT NULL,
usr_pp                  TEXT            NOT NULL,
UNIQUE(usr_logon)
  ) WITHOUT OIDS;

CREATE TABLE users_x_roles (
usr_id                  BIGINT          NOT NULL,
rl_id                   BIGINT          NOT NULL,
PRIMARY KEY(usr_id,rl_id)
) WITHOUT OIDS;

roles = Table('roles', db,
    Column('rl_id', Integer, Sequence('roles_id_seq', optional=False),
primary_key=True),
     Column('rl_name', String, nullable=False),
    Column('rl_desc', String, nullable=False))

users_x_roles = Table('users_x_roles', db,
Column('usr_id', Integer, ForeignKey('users.usr_id'), nullable=False), Column('rl_id', Integer, ForeignKey('roles.rl_id'), nullable=False))

 users = Table('users', db,
    Column('usr_id', Integer, Sequence('users_id_seq',optional=False),
primary_key=True),
    Column('usr_logon', String, nullable=False),
     Column('usr_pp', String, nullable=False),
    Column('usr_name', String, nullable=False))

assign_mapper(Role, tables.roles, properties={
     'rl_id': tables.roles.c.rl_id,
    'name': tables.roles.c.rl_name,
     'desc': tables.roles.c.rl_desc,})

 assign_mapper(User, tables.users, properties={
    'usr_id': tables.users.c.usr_id,
     'logon': tables.users.c.usr_logon,
    'pp': tables.users.c.usr_pp ,
    'name': tables.users.c.usr_name,
     '_roles': relation(Role, secondary=tables.users_x_roles,
primaryjoin=tables.users.c.usr_id==tables.users_x_roles.c.usr_id,
secondaryjoin=tables.users_x_roles.c.rl_id==tables.roles.c.rl_id,
lazy=False),})

Then when running the following:

u = User.mapper.get(1)

The following exception is raised:

/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in init(self, *args, **kwargs)
    224                     except TypeError, msg:
     225                         # re-raise with the offending class
name added to help in debugging
--> 226                         raise TypeError, '%s.%s'
%(self.__class__.__name__, msg)
227 # override oldinit, insuring that its not already one of our
     228             # own modified inits

  TypeError: User.len() of unsized object


I'm at a loss as to what I'm doing incorrectly. Any suggestions?


---- FULL TRACE ----

exceptions.TypeError                                 Traceback (most
recent call last)

/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in get(self, *ident)
    273         key = objectstore.get_id_key(ident, self.class_)
     274         #print "key: " + repr(key) + " ident: " + repr(ident)
  --> 275         return self._get(key, ident)
    276
     277     def _get(self, key, ident=None):

/usr/lib/python2.4/site-packages/SQLAlchemy-
0.1.2-py2.4.egg/sqlalchemy/mapping/mapper.py in _get(self, key, ident)
   287                 i += 1
    288             try:
--> 289 return self.select(self._get_clause, params=params)[0]
     290             except IndexError:
    291                 return None

/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in select(self, arg, **kwargs)
    450             return self.select_statement(arg, **kwargs)
     451         else:
--> 452             return self.select_whereclause (arg, **kwargs)
    453
     454     def select_whereclause(self, whereclause=None,
params=None, **kwargs):

/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in select_whereclause(self, whereclause, params, **kwargs)
     455         statement = self._compile(whereclause, **kwargs)
    456         if params is not None:
--> 457 return self.select_statement(statement, **params)
     458         else:
    459             return self.select_statement(statement)


/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in select_statement(self, statement, **params)
    468     def select_statement(self, statement, **params):
     469         statement.use_labels = True
--> 470         return self.instances(statement.execute(**params))
    471
    472     def select_text(self, text, **params):

/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in instances(self, cursor, *mappers, **kwargs)
    252             if row is None:
     253                 break
--> 254             self._instance(row, imap, result)
     255             i = 0
    256             for m in mappers:

/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in _instance(self, row, imap, result, populate_existing)
    750             instance = self.extension.create_instance(self,
row, imap, self.class_)
     751             if instance is None:
--> 752 instance = self.class_ (_mapper_nohistory=True)
    753             imap[identitykey] = instance
     754             isnew = True

/usr/lib/python2.4/site-packages/SQLAlchemy-0.1.2-py2.4.egg/ sqlalchemy/mapping/mapper.py
in init(self, *args, **kwargs)
     224                     except TypeError, msg:
    225                         # re-raise with the offending class
name added to help in debugging
--> 226                         raise TypeError, '%s.%s'
%(self.__class__.__name__, msg)
     227             # override oldinit, insuring that its not already
one of our
     228             # own modified inits

TypeError: User.len() of unsized object------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel? cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to