youre only allowed to define one primary mapper per class.  by having
assign_mapper in the constructor of a class, creating a new mapper for the
Bar class which is in a static context, it creates a new mapper for the
Bar class each time Foo's __init__ is called; all calls to this after the
first will fail.  this might have appeared to "work" in 0.1 since it was
making non-primary mappers on all the subsequent calls; since people
frequently get confused by that, you now have to be explicit if you want a
non primary mapper (and I dont think thats what youre looking for here).

basically, in this example youre looking to pull all that code out of
__init__ and put it at the module level, i.e. right after the definition
for Foo is best, and its against "Foo.Bar" which is what "self.Bar" really
is.

POX wrote:
> Hi,
>
> Why undermentioned code will not work with SA 0.2.6 anymore?
>
> After rinning:
>
> | #!/usr/bin/python
> |
> | from sqlalchemy import *
> | from sqlalchemy.mods.threadlocal import assign_mapper
> |
> | class Foo(object):
> |     class Bar(object):
> |             pass
> |     def __init__(self, url):
> |             metadata = BoundMetaData(url)
> |             table = Table('test', metadata,
> |                     Column('test_id', Integer),
> |                     Column('foo', Boolean))
> |             assign_mapper(self.Bar, table)
> |
> | tmp = Foo("sqlite://")
> | #del tmp
> | tmp2 = Foo("sqlite://")
>
> I'm getting this:
>
> Traceback (most recent call last):
>   File "./test.py", line 18, in ?
>     tmp2 = Foo("sqlite://")
>   File "./test.py", line 14, in __init__
>     assign_mapper(self.Bar, table)
>   File "/usr/lib/python2.3/site-packages/sqlalchemy/mods/threadlocal.py",
> line 33, in assign_mapper
>     assignmapper.assign_mapper(objectstore.context, class_, *args,
> **kwargs)
>   File "/usr/lib/python2.3/site-packages/sqlalchemy/ext/assignmapper.py",
> line 31, in assign_mapper
>     m = mapper(class_, extension=extension, *args, **kwargs)
>   File "/usr/lib/python2.3/site-packages/sqlalchemy/orm/__init__.py", line
> 49, in mapper
>     return Mapper(class_, table, *args, **params)
>   File "/usr/lib/python2.3/site-packages/sqlalchemy/orm/mapper.py", line
> 133, in __init__
>     self._compile_class()
>   File "/usr/lib/python2.3/site-packages/sqlalchemy/orm/mapper.py", line
> 414, in _compile_class
>     raise exceptions.ArgumentError("Class '%s' already has a primary
> mapper defined.  Use is_primary=True to assign a new primary mapper to
> the class, or use non_primary=True to create a non primary Mapper" %
> self.class_)
> sqlalchemy.exceptions.ArgumentError: Class '<class '__main__.Bar'>'
> already has a primary mapper defined.  Use is_primary=True to assign a new
> primary mapper to the class, or use non_primary=True to create a non
> primary Mapper
> --
> -=[     Piotr Ozarowski     ]=-
> -=[ http://www.ozarowski.pl ]=-
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share
> your
> opinions on IT & business topics through brief surveys -- and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV_______________________________________________
> Sqlalchemy-users mailing list
> Sqlalchemy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users
>


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to