【发布时间】:2023-03-23 00:35:01
【问题描述】:
我正试图弄清楚如何让 SQLAlchemy 类分布在多个文件中,但我一生都无法弄清楚如何去做。我对 SQLAlchemy 很陌生,所以如果这个问题是微不足道的,请原谅我..
在各自的文件中考虑这 3 个类:
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'
如何在这些文件之间共享声明性基础?
考虑到我可能会在上面扔类似 Pylons 或 Turbogears 之类的东西,实现此目的的“正确”方法是什么?
编辑 10-03-2011
我从 Pyramids 框架中找到了 this 描述,该描述描述了问题,更重要的是验证这是一个实际问题,而不仅仅是(仅)我困惑的自我是问题所在。希望它可以帮助其他敢于走这条危险道路的人:)
【问题讨论】:
-
@S.Lott 如果所有类都在一个文件中,上述方法有效,所以你告诉我:)
-
您的代码没有出现此错误,请发布有实际错误的代码。修复你的导入,让它运行,这样别人才能真正看到你的错误。
-
@S.Lott 我的困惑显然集中在如何避免循环导入。我来自C,这不是问题。很抱歉占用您的时间。
-
@joveha:什么?您遇到的这些循环导入问题是什么。请发布带有循环导入的代码,以便我们解释如何分解它们并避免循环。这些 cmets 中有太多模糊的假设。你有什么问题?请具体。
标签: python sqlalchemy