2010-11-20 24 views
5

我想了解如何使用SQLAlchemy的聲明式ORM定義一對多關係,並試圖讓the example工作,但我得到一個錯誤,我的子類無法找到(當然,因爲它後來宣佈...)SQLAlchemy聲明式一對多未定義的錯誤

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.

但是,如何定義這個,沒有錯誤?

代碼:

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

回答

13

這裏是我如何做到這一點:

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() 
相關問題