Chris Withers wrote:
> Hi All,
>
> The script at the end of this message blows up with:
>
> sqlalchemy.exc.InvalidRequestError: When compiling mapper
> Mapper|Employee|employee, expression 'Organisation' failed to locate a
> name ("name 'Organisation' is not defined"). If this is a class name,
> consider adding this relation() to the <class '__main__.Employee'> class
> after both dependent classes have been defined.
>
> ...unless the line preceded with #yuk is present.
>
> Why does declarative store this information in its own registry rather
> than using the MetaData to do so?

MetaData is not an ORM aware object.  it doesn't store class names.


> Is there a nicer way I can achieve this result? I have multiple bases
> since Michael suggested this was the right way to go to have base
> classes for mapped classes that do nothing but contain common field
> definitions and functionality...

der, OK if I did actually say that, its obsolete information.  Use
http://www.sqlalchemy.org/trac/wiki/UsageRecipes/DeclarativeMixins .   Yes
the recipe will probably be built in someday once we have time to cover
all contingencies.

Or reference "Organization" directly without using a string for its name.


>
> cheers,
>
> Chris
>
> from sqlalchemy import create_engine, MetaData
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import relation, sessionmaker
> from sqlalchemy.schema import Column, ForeignKey
> from sqlalchemy.types import Integer, String, DateTime
>
> engine = create_engine('sqlite://')
>
> metadata = MetaData()
>
> Base1 = declarative_base(metadata=metadata)
> Base2 = declarative_base(metadata=metadata)
>
> # yuk
> Base2._decl_class_registry=Base1._decl_class_registry
>
> class Employee(Base1):
>      __tablename__ = 'employee'
>      id = Column(Integer, primary_key=True)
>      name = Column(String(1000), nullable=False, index=True)
>      org = relation("Organisation")
>      org_id = Column(Integer, ForeignKey('organisation.id'))
>
> class Organisation(Base2):
>      __tablename__ = 'organisation'
>      id = Column(Integer, primary_key=True)
>      name = Column(String(50))
>      employees = relation("Employee")
>
> metadata.create_all(engine)
>
> o = Organisation(name='SomeOrg')
>
> --
> Simplistix - Content Management, Batch Processing & Python Consulting
>              - http://www.simplistix.co.uk
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/sqlalchemy?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to