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】:

如果是子包类,在子包中将ItemAuction类添加到__init__.py中。

【讨论】:

谢谢。现在可以了。但是,您还有其他解决方法来解决这个问题吗?我应该在__init__.py 文件中导入每个模型类吗?我只是想知道是否有更好的方法。【参考方案4】:

此外,即使这不适用于 OP,对于登陆这里的任何人都遇到相同的错误,请检查以确保您的表名中没有破折号。

例如,一个名为“movie-genres”的表在 SQLAlchemy 关系中用作辅助表,将产生相同的错误"name 'movie' is not defined",因为它只会读取到破折号。切换到下划线(而不是破折号)可以解决问题。

【讨论】:

【参考方案5】:

这一切都是因为我在 Pyramid 中设置 SQLAlchemy 的方式。从本质上讲,您需要严格遵守this section,并确保使用相同的declarative_base 实例作为每个模型的基类。

我也没有将数据库引擎绑定到我的 DBSession,直到您尝试访问表元数据(当您使用关系时会发生这种情况)才会打扰您。

【讨论】:

以上是关于SQLAlchemy 找不到类名的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 查询 - 动态类选择

org.hibernate.MappingException:找不到实体类(使用限定的类名不起作用)

面向对象,类名称空间,查找顺序,组合

SQLalchemy 找不到用于创建外键的表

java编译 为啥显示找不到文件

springboot打包启动时报mybatis的typeAlias类名找不到的错误