簡略化して、私は次のクラス構造を持っています(単一ファイル内):
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との単純な関係をどのように行うかの例なので、ここにかなり明らかな誤りがある場合は、謝罪します。
これはすべて、PyramidでSQLAlchemyを設定した方法が原因であることがわかりました。基本的に このセクション の後に続き、各モデルの基本クラスと同じdeclarative_base
インスタンスを使用する必要があります。
また、データベースエンジンをDBSession
にバインドしていませんでした。これは、リレーションシップを使用するときに発生するテーブルメタデータにアクセスしようとするまで気になりません。
また、これはOPには当てはまりませんが、ここに着陸した人が同じエラーを受け取った場合は、テーブル名にダッシュが含まれていないことを確認してください。
たとえば、「movie-genres」という名前のテーブルをSQLAlchemy関係のセカンダリとして使用すると、ダッシュまでしか読み取られないため、同じエラー"name 'movie' is not defined"
が生成されます。 (ダッシュの代わりに)アンダースコアに切り替えると問題が解決します。
サブパッケージクラスの場合は、サブパッケージの__init__.py
にItem
およびAuction
クラスを追加します。
「ベース」の代わりに「db.Model」を継承することで同じエラーを解決しました...しかし、私はフラスコをやっています
例えば:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class someClass(db.Model):
someRelation = db.relationship("otherClass")