SQLAlchemy 找不到类名
Posted
技术标签:
【中文标题】SQLAlchemy 找不到类名【英文标题】:SQLAlchemy cannot find a class name 【发布时间】:2012-02-23 17:28:09 【问题描述】:简化,我有以下类结构(在单个文件中):
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 建立简单关系的示例,所以如果这里有一些相当明显的错误,我深表歉意。
【问题讨论】:
这个答案也可能有用:***.com/questions/7478403/… 这个答案也可能有用:***.com/a/4235691/232794 【参考方案1】:我通过继承“db.Model”而不是“Base”解决了同样的错误......但我正在做烧瓶
例如:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class someClass(db.Model):
someRelation = db.relationship("otherClass")
【讨论】:
您能否通过显示您的解决方案的代码 sn-p 对 OP 提供更多帮助?谢谢!from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() someClass(db.Model): someRelation = db.relationship("otherClass")
确实这对我也有用。我在装有棉花糖的烧瓶里。用类 someClass(db.Model) 替换类 someClass(Base) 修复了依赖链【参考方案2】:
Importing all SQLAlchemy Models 上的 SQLAlchemy 文档部分说明:
但是,由于 SQLAlchemy 的“声明式”配置模式的行为,需要导入所有包含活动 SQLAlchemy 模型的模块,然后才能成功使用这些模型。因此,如果您使用具有声明性基础的模型类,您需要找到一种方法来导入所有模型模块,以便能够在您的应用程序中使用它们。
导入所有模型(和关系)后,找不到类名的错误已解决。
注意:我的应用程序没有使用 Pyramid,但同样的原则也适用。【讨论】:
【参考方案3】:如果是子包类,在子包中将Item
和Auction
类添加到__init__.py
中。
【讨论】:
谢谢。现在可以了。但是,您还有其他解决方法来解决这个问题吗?我应该在__init__.py
文件中导入每个模型类吗?我只是想知道是否有更好的方法。【参考方案4】:
此外,即使这不适用于 OP,对于登陆这里的任何人都遇到相同的错误,请检查以确保您的表名中没有破折号。
例如,一个名为“movie-genres”的表在 SQLAlchemy 关系中用作辅助表,将产生相同的错误"name 'movie' is not defined"
,因为它只会读取到破折号。切换到下划线(而不是破折号)可以解决问题。
【讨论】:
【参考方案5】:这一切都是因为我在 Pyramid 中设置 SQLAlchemy 的方式。从本质上讲,您需要严格遵守this section,并确保使用相同的declarative_base
实例作为每个模型的基类。
我也没有将数据库引擎绑定到我的 DBSession
,直到您尝试访问表元数据(当您使用关系时会发生这种情况)才会打扰您。
【讨论】:
以上是关于SQLAlchemy 找不到类名的主要内容,如果未能解决你的问题,请参考以下文章