2017-02-16 4 views
0

リフレクションを使用して2つのクラスを生成しています。 1つはメッセージを表し、送信/受信エンティティ(企業または人)を保持するテーブルに対して2つの外部キーを持っています。Flask-SQLAlchemyとリフレクションとの関係

2つの外部キーを指定すると、対応する関係を作成する必要がありますが、これは簡単なはずですが、動作させることはできません。

私のコードは次のようになります。「SenderIDのは間違いなくの一つですので、私は、これを作るのかわからないんだけど

InvalidRequestError: When initializing mapper Mapper|FileData|FileData, expression 
'SenderId' failed to locate a name ("name 'SenderId' is not defined"). If this is a 
class name, consider adding this relationship() to the <class '__main__.FileData'> 
class after both dependent classes have been defined. 

class Entity(db.Model): 
    __tablename__ = 'Entity' 
    __table_args__ = { 
     'autoload': True, 
     'schema': 'msg', 
     'autoload_with': db.engine 
    } 

class FileData(db.Model): 
    __tablename__ = 'FileData' 
    __table_args__ = { 
     'autoload': True, 
     'schema': 'msg', 
     'autoload_with': db.engine 
    } 
    sender = db.relationship('Entity', foreign_keys='SenderId') 
    receiver = db.relationship('Entity', foreign_keys='ReceiverId') 

それは、次のメッセージで失敗テーブルの列を使用し、コードの他の部分でも問題なくアクセスできます。

+0

FileDataとEntityの間に1対1の関係はありますか? – Cicero

+0

シセロ、そうではありません。すべてのFileDataエントリには、エンティティテーブルからの1つの送信者と1つの受信者がありますが、各Entityテーブルエントリは多くのFileDataエントリの送信者または受信者になります。 – user3199144

+0

さて、私はそれを理解しようとしていますが、苦労しています。しかし、私があなたに伝えることの1つは、あなたがforeign_keys定義で小文字を使用するべきであるということです。例: 'sender.id' /' receiver.id' – Cicero

答えて

0

リレーションシップが定義外に追加された場合は正常に機能します。これは、最初にリフレクションを実行してから、SenderIdとReceiverIdの列を表示できるようになりました。同様に:

class Entity(db.Model): 
    __tablename__ = 'Entity' 
    __table_args__ = { 
     'autoload': True, 
     'schema': 'msg', 
     'autoload_with': db.engine 
    } 

class FileData(db.Model): 
    __tablename__ = 'FileData' 
    __table_args__ = { 
     'autoload': True, 
     'schema': 'msg', 
     'autoload_with': db.engine 
    } 

FileData.sender = db.relationship('Entity', foreign_keys=FileData.SenderId) 
FileData.receiver = db.relationship('Entity', foreign_keys=FileData.ReceiverId)