前提・実現したいこと
- SQLAlchemyを利用して、PosegreSQLのデータベースを作っています。
- 外部キーを用いたテーブル作成がうまくいきません。下記の2つのテーブルを作りたいです。bs_secondaryテーブルは、外部キーとしてbs_primaryテーブルのidを参照させたいです。
(bs_primary)
id | name |
---|---|
1 | 流動資産 |
2 | 固定資産 |
3 | 流動負債 |
4 | 固定負債 |
5 | 純資産 |
(bs_secondary)
id | name | primary_id |
---|---|---|
101 | 現金 | 1 |
102 | 当座預金 | 1 |
103 | 普通預金 | 1 |
… | … | … |
- まず最初にprimaryテーブルを作成しました。これは成功しました。
- その後にsecondaryテーブルを作成しようとして、失敗しています。
発生している問題・エラーメッセージ
NoReferencedTableError Traceback (most recent call last) <ipython-input-27-84edb30c4bec> in <module> 9 10 ---> 11 Base.metadata.create_all(bind=engine) ~\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py in create_all(self, bind, tables, checkfirst) 4002 self, 4003 checkfirst=checkfirst, -> 4004 tables=tables) 4005 4006 def drop_all(self, bind=None, tables=None, checkfirst=True): ~\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _run_visitor(self, visitorcallable, element, connection, **kwargs) 1938 connection=None, **kwargs): 1939 with self._optional_conn_ctx_manager(connection) as conn: -> 1940 conn._run_visitor(visitorcallable, element, **kwargs) 1941 1942 class _trans_ctx(object): ~\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _run_visitor(self, visitorcallable, element, **kwargs) 1547 def _run_visitor(self, visitorcallable, element, **kwargs): 1548 visitorcallable(self.dialect, self, -> 1549 **kwargs).traverse_single(element) 1550 1551 ~\Anaconda3\lib\site-packages\sqlalchemy\sql\visitors.py in traverse_single(self, obj, **kw) 119 meth = getattr(v, "visit_%s" % obj.__visit_name__, None) 120 if meth: --> 121 return meth(obj, **kw) 122 123 def iterate(self, obj): ~\Anaconda3\lib\site-packages\sqlalchemy\sql\ddl.py in visit_metadata(self, metadata) 734 735 collection = sort_tables_and_constraints( --> 736 [t for t in tables if self._can_create_table(t)]) 737 738 seq_coll = [s for s in metadata._sequences.values() ~\Anaconda3\lib\site-packages\sqlalchemy\sql\ddl.py in sort_tables_and_constraints(tables, filter_fn, extra_dependencies) 1093 continue 1094 -> 1095 dependent_on = fkc.referred_table 1096 if dependent_on is not table: 1097 mutable_dependencies.add((dependent_on, table)) ~\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py in referred_table(self) 3000 3001 """ -> 3002 return self.elements[0].column.table 3003 3004 def _validate_dest_table(self, table): ~\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py in __get__(self, obj, cls) 765 if obj is None: 766 return self --> 767 obj.__dict__[self.__name__] = result = self.fget(obj) 768 return result 769 ~\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py in column(self) 1889 "foreign key to target column '%s'" % 1890 (self.parent, tablekey, colname), -> 1891 tablekey) 1892 elif parenttable.key not in parenttable.metadata: 1893 raise exc.InvalidRequestError( NoReferencedTableError: Foreign key associated with column 'bs_secondary.bs_primary_id' could not find table 'bs_primary' with which to generate a foreign key to target column 'id'
該当のソースコード
python
1from sqlalchemy import Column, ForeignKey, Integer, String, create_engine 2from sqlalchemy.ext.declarative import declarative_base 3from sqlalchemy.orm import * 4engine = create_engine('postgresql://username:password@127.0.0.1:5432/database_name') 5 6Base = declarative_base() 7 8class BS_PRIMARY(Base): 9 __tablename__ = 'bs_primary' 10 11 id = Column(Integer, primary_key=True, autoincrement=False) 12 name = Column(String) 13 14Base.metadata.create_all(bind=engine)
↑
上記までは成功しました。
下記を実行した所、上記のエラーが出ています。
python
1Base = declarative_base() 2 3class BS_SECONDARY(Base): 4 __tablename__ = 'bs_secondary' 5 6 id = Column(Integer, primary_key=True, autoincrement=False) 7 name = Column(String) 8 bs_primary_id = Column(Integer, ForeignKey("bs_primary.id")) 9 10 11Base.metadata.create_all(bind=engine)
対応策1
- 一旦、bs_primaryを削除し、bs_primaryとbs_secondaryを同時に作成した所、作成することができました。
- 後からリレーションの関係のあるテーブルを追加する方法があれば良いのですが、良い方法はあるのでしょうか。
何かお気づきの点ありましたら、ご教示頂ければ幸いです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー