SQLAlchemy无法找到类名

时间:2012-02-01 00:08:10

标签: python sqlalchemy pyramid relationships

简化,我有以下类结构(在一个文件中):

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建立简单关系的例子,所以如果在这里有一些相当明显的错误我会道歉。

5 个答案:

答案 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)

如果它是子包类,则将ItemAuction类添加到子包中的__init__.py

答案 4 :(得分:0)

Importing all SQLAlchemy Models上的SQLAlchemy文档的部分内容为:

  

但是,由于SQLAlchemy的“声明式”配置模式的行为,必须先导入所有保存活动SQLAlchemy模型的模块,然后才能成功使用它们。因此,如果您使用具有声明性基础的模型类,则 您需要找出一种方法来导入所有模型模块,以便能够在您的应用程序中使用它们。

一旦我导入了所有模型(和关系),就解决了找不到类名的错误。

  • 注意:我的应用程序不使用Pyramid,但是适用相同的原理。