外部モジュールでベース変数を宣言すると、上記のエラーが発生します。基本変数は、次の投稿で説明されているように、モジュール db_connect.py で宣言されています: 2 つの異なるファイル間で ForeignKey 関係を作成する方法
db_connect.pyで、次のように宣言しました。
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Engine = create_engine('postgresql://postgres:pass@server:5432/mydb')
Base = declarative_base()
data_template.pyには次のものがあります。
from db_connect import Engine, Base
class DataTemplate (Base):
__tablename__ = 'data_template'
id = Column(Integer(5), primary_key=True, autoincrement = True)
version = Column(String(3), nullable = False)
specification = Column(String(1), nullable = False)
__table_args__ = (UniqueConstraint("version", "specification"), )
Base.metadata.create_all()
質問 1:
上記で、テーブルが作成されますが、data_template.py: Base.metadata.create_all()でメタデータが取得され、エラーで強調表示されます:インポートからの未定義の変数: メタデータはなぜそのエラーが発生するのですか?
質問 2:
load_file.pyでは、data_template.pyモジュールから DataTemplateFile クラスをインポートする必要があります。このインポートを行わないと、エラーが発生します
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'load_file.data_template_file_id' could not find table 'data_template_file' with which to generate a foreign key to target column 'id'
ただし、以下のようにインポートすると機能し、テーブルが作成されますが、DataTemplateFile インポートが使用されていないことを示す「警告」が Eclipse に表示されます。それでも、インポートしないと、すぐ上で説明したようにコードが失敗します。
from data_template import DataTemplateFile
class LoadFile (Base):
__tablename__ = "load_file"
id = Column(Integer(10), primary_key = True)
file_name = Column(String(250), nullable = False, unique = True)
data_template_file_id = Column(Integer, ForeignKey('data_template_file.id'), nullable = False)
loadfile = relationship("DataTemplateFile",backref=backref('LoadFile', order_by=id))