2010-11-20 2 views
5

Ich versuche herauszufinden, wie man eine Eins-zu-viele-Beziehung mit SQLAlchemy deklarative ORM zu definieren, und versuchen, the example zu arbeiten, aber ich bekomme einen Fehler, dass meine Unterklasse kann nicht (natürlich, weil es später erklärt hat ...) zu findenSQLAlchemy deklarative Eins-zu-viele nicht definiert Fehler

InvalidRequestError: When initializing mapper Mapper|Parent|parent, expression 'Child' failed to locate a name ("name 'Child' is not defined"). If this is a class name, consider adding this relationship() to the class after both dependent classes have been defined.

Aber wie mache ich das definieren, ohne den Fehler?

Der Code:

from sqlalchemy import create_engine 
from sqlalchemy import Column, Integer, ForeignKey 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker, relationship 
from dev.historyMeta import VersionedMeta, VersionedListener 

global engine, Base, Session 
engine = create_engine('mysql+mysqldb://user:[email protected]:3306/testdb', pool_recycle=3600) 
Base = declarative_base(bind=engine, metaclass=VersionedMeta) 
Session = sessionmaker(extension=VersionedListener()) 


class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    children = relationship("Child", backref="parent") 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('parent.id')) 

Base.metadata.create_all() 

Antwort

13

Hier ist, wie ich es tun:

from sqlalchemy import create_engine 
from sqlalchemy import Column, Integer, ForeignKey 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker, relationship 

engine = create_engine('sqlite://', echo=True) 
Base = declarative_base(bind=engine) 
Session = sessionmaker(bind=engine) 


class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('parent.id')) 
    parent = relationship(Parent, backref='children') 

Base.metadata.create_all()