【问题标题】:SQLAlchemy import tables with relationshipsSQLAlchemy 导入具有关系的表
【发布时间】:2012-06-18 06:00:07
【问题描述】:

我在将表与不同文件中的关系分开时遇到问题。我希望下面的表格位于三个单独的文件中,并在第三方页面中导入 TableA,但我无法管理加载顺序。

在大多数情况下,我都会收到以下错误。

sqlalchemy.exc. InvalidRequestError:初始化映射器 Mapper|TableA|tablea 时,表达式 'TableB' 未能找到名称(“名称 'TableB' 未定义”)。如果这是一堂课 名称,请考虑在定义了两个依赖类之后将此 relationship() 添加到类中。

class TableA(Base):
    __tablename__ = "tablea"
   id = Column(Integer, primary_key=True)
   name = Column(String)

   tableB = relationship("TableB", secondary = TableC.__table__)

class TableB(Base):
   __tablename__ = "tableb"
   id = Column(Integer, primary_key=True)
  name = Column(String)

class TableC(Base):
   __tablename__ = "tableab"
   tableAId = Column("table_a_id", Integer, ForeignKey("TableA.id"), primary_key=True)
   tableBId = Column("table_b_id", Integer, ForeignKey("TableB.id"), primary_key=True)

【问题讨论】:

    标签: python sqlalchemy relationship


    【解决方案1】:

    这应该可以工作(注意 TableC.table 被替换为表名以避免循环加载模块):

    ### base.py
    engine = create_engine('sqlite:///:memory:', echo=True)
    Session = sessionmaker(bind=engine)
    Base = declarative_base(bind=engine)
    
    ### classA.py
    from base import Base
    from classB import TableB
    
    class TableA(Base):
        __tablename__ = 'tablea'
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
        tableBs = relationship("TableB", secondary="tableab")
        #tableBs = relationship("TableB", secondary=TableC.__table__)
    
    ### classB.py
    from base import Base
    
    class TableB(Base):
        __tablename__ = 'tableb'
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
    
    ### classC.py
    from base import Base
    from classA import TableA
    from classB import TableB
    
    class TableC(Base):
        __tablename__ = 'tableac'
        tableAId = Column(Integer, ForeignKey("tablea.id"), primary_key=True, )
        tableBId = Column(Integer, ForeignKey("tableb.id"), primary_key=True, )
    
    ### main.py
    from base import Base, Session, engine
    from classA import TableA
    from classB import TableB
    from classC import TableC
    Base.metadata.create_all(engine)
    

    我还认为 ForeignKey 参数区分大小写,因此您的代码可能无法正常工作,因为“TableA.id”在区分大小写时与“tablea”名称不匹配。

    【讨论】:

    • 是否必须导入类才能在关系中使用它?
    • @BalthazarRouberol,经过测试,是的,您确实需要每个类中的导入
    • 在 IRC 上询问后确认。我会为此提交一个文档补丁,因为我也不清楚。
    • 为什么 TableC 的 __tablename__ 属性有“tableab”?
    • @jossefaz:只是一个错字(我现在会更正一下),感谢您的注意。
    【解决方案2】:
    from sqlalchemy import Column, String, Integer
    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    
    
    class Parent(Base):
        __tablename__ = 'Parent'
        ParentID = Column(Integer, primary_key=True)
        Description = Column(String)
    
        def __init__(self, ParentID, Description):
            self.ParentID = ParentID
            self.Description = Description
    ----------------------------------------------------------------------
    
    from sqlalchemy import Column, String, Integer, ForeignKey
    import Parent
    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    
    
    class Child(Base):
        __tablename__ = "Child"
        ChildID = Column(Integer, primary_key=True)
        Description = Column(String)
        ParentID = Column('CompanyID', Integer, ForeignKey(Parent.ParentID))
    
        def __init__(self, ChildID, Description,ParentID):
            self.ChildID = ChildID
            self.Description = Description
            self.ParentID=ParentID
    

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多