跨文件的SQLAlchemy类

发布于 2021-01-29 18:32:10

我试图弄清楚如何将SQLAlchemy类分布到多个文件中,而我可以终生不搞清楚如何做到这一点。我是SQLAlchemy的新手,如果这个问题不重要,请原谅我。

各自的文件中 考虑以下三个类:

A.py:

from sqlalchemy import *
from main import Base

class A(Base):
    __tablename__ = "A"
    id  = Column(Integer, primary_key=True)
    Bs  = relationship("B", backref="A.id")
    Cs  = relationship("C", backref="A.id")

B.py:

from sqlalchemy import *
from main import Base

class B(Base):
    __tablename__ = "B"
    id    = Column(Integer, primary_key=True)
    A_id  = Column(Integer, ForeignKey("A.id"))

C.py:

from sqlalchemy import *
from main import Base

class C(Base):
    __tablename__ = "C"    
    id    = Column(Integer, primary_key=True)
    A_id  = Column(Integer, ForeignKey("A.id"))

然后说我们有一个 main.py之类的 东西:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref, sessionmaker

Base = declarative_base()

import A
import B
import C

engine = create_engine("sqlite:///test.db")
Base.metadata.create_all(engine, checkfirst=True)
Session = sessionmaker(bind=engine)
session = Session()

a  = A.A()
b1 = B.B()
b2 = B.B()
c1 = C.C()
c2 = C.C()

a.Bs.append(b1)
a.Bs.append(b2)    
a.Cs.append(c1)
a.Cs.append(c2)    
session.add(a)
session.commit()

上面给出了错误:

sqlalchemy.exc.NoReferencedTableError: Foreign key assocated with column 'C.A_id' could not find table 'A' with which to generate a foreign key to target column 'id'

如何在这些文件之间共享声明式库?

考虑到我可能 还会 在上面 放置 诸如 PylonsTurbogears之 类的东西,完成此任务的“正确”方法是什么?

编辑10-03-2011

我从Pyramids框架中找到了这个描述,该描述描述了问题,更重要的是 验证
了这是一个实际问题,而不仅仅是(只是)我那困惑的自我。希望它可以帮助其他敢于走这条危险道路的人:)

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    解决您的问题的最简单方法是Base取出导入的模块AB然后C;中断循环导入。

    base.py

    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    

    py

    from sqlalchemy import *
    from base import Base
    from sqlalchemy.orm import relationship
    
    class A(Base):
        __tablename__ = "A"
        id  = Column(Integer, primary_key=True)
        Bs  = relationship("B", backref="A.id")
        Cs  = relationship("C", backref="A.id")
    

    b.py

    from sqlalchemy import *
    from base import Base
    
    class B(Base):
        __tablename__ = "B"
        id    = Column(Integer, primary_key=True)
        A_id  = Column(Integer, ForeignKey("A.id"))
    

    py

    from sqlalchemy import *
    from base import Base
    
    class C(Base):
        __tablename__ = "C"    
        id    = Column(Integer, primary_key=True)
        A_id  = Column(Integer, ForeignKey("A.id"))
    

    main.py

    from sqlalchemy import create_engine
    from sqlalchemy.orm import relationship, backref, sessionmaker
    
    import base
    
    
    import a
    import b
    import c
    
    engine = create_engine("sqlite:///:memory:")
    base.Base.metadata.create_all(engine, checkfirst=True)
    Session = sessionmaker(bind=engine)
    session = Session()
    
    a1 = a.A()
    b1 = b.B()
    b2 = b.B()
    c1 = c.C()
    c2 = c.C()
    
    a1.Bs.append(b1)
    a1.Bs.append(b2)    
    a1.Cs.append(c1)
    a1.Cs.append(c2)    
    session.add(a1)
    session.commit()
    

    适用于我的机器:

    $ python main.py ; echo $?
    0
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看