On Wed, Oct 26, 2011 at 2:22 AM, Stefano Fontanelli <s.fontane...@asidev.com
> wrote:

>
> Hi James,
> you cannot define two mapper properties that use the same name.
>

Thank you.  I truly appreciate your response.  I can now implement the table
interconnection while both classes are defined in the same file.  My problem
is when the classes are separated.  Given the following two files:
========8<----------------------
#!/usr/bin/env python
""" user.py """
from sqlalchemy import create_engine, Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

    def __repr__(self):
        return "<User('%s', '%s', '%s', '%s')>" % (self.id, self.name,
self.fullname, self.password)

if __name__ == '__main__':
    engine = create_engine('sqlite:///db', echo=True)
    #Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()

    for user in session.query(User).all():
        print user
========8<----------------------
#!/usr/bin/env python
""" address.py """
from sqlalchemy import create_engine, Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref

from user import User

Base = declarative_base()

class Address(Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)
    email_address = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'), nullable=False)

    user = relationship('User', backref=backref('addresses', order_by=id))

    def __init__(self, email):
        self.email_address = email

    def __repr__(self):
        return "<Address('%s', '%s', '%s')>" % (self.id, self.email_address,
self.user_id)

if __name__ == '__main__':
    engine = create_engine('sqlite:///db', echo=True)
    Session = sessionmaker(bind=engine)
    session = Session()

    for addr in session.query(Address).all():
        print addr
========8<----------------------
I get the following error when executing address.py:
========8<----------------------
Traceback (most recent call last):
  File "./address.py", line 35, in <module>
    for addr in session.query(Address).all():
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
line 897, in query
    return self._query_cls(entities, self, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py",
line 105, in __init__
    self._set_entities(entities)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py",
line 114, in _set_entities
    self._setup_aliasizers(self._entities)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py",
line 129, in _setup_aliasizers
    _entity_info(entity)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/util.py", line
476, in _entity_info
    mapperlib.configure_mappers()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py",
line 2719, in configure_mappers
    mapper._post_configure_properties()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py",
line 1035, in _post_configure_properties
    prop.init()
  File
"/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/interfaces.py", line
121, in init
    self.do_init()
  File
"/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line
899, in do_init
    self._process_dependent_arguments()
  File
"/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line
987, in _process_dependent_arguments
    self.target = self.mapper.mapped_table
  File
"/usr/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py",
line 432, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File
"/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line
880, in mapper
    mapper_ = mapper.class_mapper(self.argument(),
  File
"/usr/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative.py", line
1214, in return_cls
    (prop.parent, arg, n.args[0], cls)
sqlalchemy.exc.InvalidRequestError: When initializing mapper
Mapper|Address|addresses, expression 'User' failed to locate a name ("name
'User' is not defined"). If this is a class name, consider adding this
relationship() to the <class '__main__.Address'> class after both dependent
classes have been defined.
========8<----------------------
Am I forced to define both classes within the same scope?  Again, any candor
anyone would care to share would be greatly appreciated.

Thanks.

-- 
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