2016-11-21 8 views
0

したがって、これらの2つのテーブル間の単純な一対多関係を実装しようとしています。私はドキュメントを読んで、ネットをこすり、これを解決するために多くの作業を入れて、私はあなたに目を向ける。プライマリキーを使用しない1対多数の関係を持つテーブルの作成

私はデータベースへの完全なアクセス権を持ち、仕事をする類似の関係で他のテーブルを作成することができます。

私はmariadb "mysql"を使用しています。

テーブル内の各行Tradableにはtick_size_idがあり、すべての行にはtick_size_idがあります。そして、私はその列にそれらを接続したい、私はどのように把握することはできません。

base = declarative_base() 
class Tradables(base): 
    __tablename__ = "tradables" 

    id = Column(Integer, primary_key=True) 
    tick_size_id = Column(Integer, nullable=False) 
    ticks = relationship("Ticks") 


class Ticks(base): 
    __tablename__ = "ticks" 

    id = Column(Integer, primary_key=True) 
    tick_size_id = Column(Integer, ForeignKey("tradables.tick_size_id")) 


def main(): 
    engine = create_engine("mysql+pymysql://user:[email protected]/database?host=localhost?port=3306") 
    base.metadata.create_all(engine) 


if __name__ == '__main__': 
    main() 

これは動作しません。

として失敗します。

sqlalchemy.exc.InternalError:。(pymysql.err.InternalError)(1005、tはテーブルTradingを作成\ 'に' ticksは(errnoに:150は "外部キー制約が正しく形成されています。" ) ')[SQL:' \ n

CREATE TABLE ticks (\n\t 
    id INTEGER NOT NULL AUTO_INCREMENT, \n\t 
    tick_size_id INTEGER, \n\t 
    PRIMARY KEY (id), \n\t 
    FOREIGN KEY(tick_size_id) REFERENCES tradables (tick_size_id)\n)\n\n'] 

私は間違っていますか?


編集:

は、これらの両方の作成の注文を試してみましたが、同じ結果を与えるの両方。

base.metadata.tables["ticks"].create(bind=engine) 
base.metadata.tables["tradables"].create(bind=engine) 

base.metadata.tables["tradables"].create(bind=engine) 
base.metadata.tables["ticks"].create(bind=engine) 
+0

他の順序でテーブルを作成する。 –

答えて

1

あなたはtradables.tick_size_idにインデックスを持っている必要があります。私は錬金術師ではないが、それは何かのようになるだろうと思う。

... 
__tablename__ = "tradables" 

id = Column(Integer, primary_key=True) 
tick_size_id = Column(Integer, nullable=False, index=True) 
ticks = relationship("Ticks") 
... 
+0

チャームのように働いた。ありがとう。 – Simon

関連する問題