web-dev-qa-db-ja.com

SQLAlchemyはクラス名を見つけることができません

簡略化して、私は次のクラス構造を持っています(単一ファイル内):

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との単純な関係をどのように行うかの例なので、ここにかなり明らかな誤りがある場合は、謝罪します。

32
Ross

これはすべて、PyramidでSQLAlchemyを設定した方法が原因であることがわかりました。基本的に このセクション の後に続き、各モデルの基本クラスと同じdeclarative_baseインスタンスを使用する必要があります。

また、データベースエンジンをDBSessionにバインドしていませんでした。これは、リレーションシップを使用するときに発生するテーブルメタデータにアクセスしようとするまで気になりません。

22
Ross

また、これはOPには当てはまりませんが、ここに着陸した人が同じエラーを受け取った場合は、テーブル名にダッシュが含まれていないことを確認してください。

たとえば、「movie-genres」という名前のテーブルをSQLAlchemy関係のセカンダリとして使用すると、ダッシュまでしか読み取られないため、同じエラー"name 'movie' is not defined"が生成されます。 (ダッシュの代わりに)アンダースコアに切り替えると問題が解決します。

2
Katie Byers

サブパッケージクラスの場合は、サブパッケージの__init__.pyItemおよびAuctionクラスを追加します。

0
mosi_kha

「ベース」の代わりに「db.Model」を継承することで同じエラーを解決しました...しかし、私はフラスコをやっています

例えば:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class someClass(db.Model):
    someRelation = db.relationship("otherClass")
0
Bob Rusovčev