简化,我有以下类结构(在一个文件中):
Base = declarative_base()
class Item(Base):
__tablename__ = 'item'
id = Column(BigInteger, primary_key=True)
# ... skip other attrs ...
class Auction(Base):
__tablename__ = 'auction'
id = Column(BigInteger, primary_key=True)
# ... skipped ...
item_id = Column('item', BigInteger, ForeignKey('item.id'))
item = relationship('Item', backref='auctions')
我从中得到以下错误:
sqlalchemy.exc.InvalidRequestError
InvalidRequestError: When initializing mapper Mapper|Auction|auction, expression
'Item' failed to locate a name ("name 'Item' is not defined"). If this is a
class name, consider adding this relationship() to the Auction class after
both dependent classes have been defined.
我不确定Python如何找不到Item类,因为即使在传递类而不是名称作为字符串时,我也会得到相同的错误。我一直在努力寻找如何与SQLAlchemy建立简单关系的例子,所以如果在这里有一些相当明显的错误我会道歉。
答案 0 :(得分:22)
这一切都归结为我在Pyramid中设置SQLAlchemy的方式。基本上你需要跟着this section跟上这封信,并确保你使用相同的declarative_base
实例作为每个模型的基类。
我也没有将数据库引擎绑定到我的DBSession
,这在您尝试访问表元数据时不会打扰您,这会在您使用关系时发生。
答案 1 :(得分:2)
我通过继承'db.Model'而不是'Base'解决了相同的错误...但是我在做烧瓶
例如:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class someClass(db.Model):
someRelation = db.relationship("otherClass")
答案 2 :(得分:1)
此外,即使这不适用于OP,对于任何登陆此处的人都会遇到相同的错误,请检查以确保您的所有表名都没有破折号。
例如,一个名为“movie-genres”的表然后在SQLAlchemy关系中用作辅助表将生成相同的错误"name 'movie' is not defined"
,因为它只会读取到破折号。切换到下划线(而不是短划线)可以解决问题。
答案 3 :(得分:0)
如果它是子包类,则将Item
和Auction
类添加到子包中的__init__.py
。
答案 4 :(得分:0)
Importing all SQLAlchemy Models上的SQLAlchemy文档的部分内容为:
但是,由于SQLAlchemy的“声明式”配置模式的行为,必须先导入所有保存活动SQLAlchemy模型的模块,然后才能成功使用它们。因此,如果您使用具有声明性基础的模型类,则 您需要找出一种方法来导入所有模型模块,以便能够在您的应用程序中使用它们。
一旦我导入了所有模型(和关系),就解决了找不到类名的错误。