fastapiを使っています。DBは現状sqliteで開発をしています。
外部キーを使いたいのですが、公式サイトを読んだり日本語の記事を読んだりしてもイマイチ理解できていません。
models.pyコードは以下です。
python
1from sqlalchemy import Boolean,Column,ForeignKey,Integer,String 2from sqlalchemy.orm import relationship 3 4class Parenttest(Base): 5 __tablename__="oya" 6 id=Column(Integer,primary_key=True,unique=True) 7 kodomox=relationship("Childstest",back_populates="oyax") 8 9class Childstest(Base): 10 __tablename__="kodomo" 11 id=Column(Integer,primary_key=True,unique=True) 12 oyanoid=Column(Integer,ForeignKey("oya.id")) 13 oyax=relationship("Parenttest",back_populates="kodomox") 14 15
このDBに対する操作が以下です。
以下のコードでは「参照している外部テーブルに存在しない値」を外部キーに保存しようとしているのでエラーになることを期待しています。
python
1#Parenttestに一つ登録。 2db_test=models.Parenttest() 3db.add(db_test) 4db.commit() 5 6#Childstestに(外部参照先のParenttestに存在しない)IDで登録。 7db_child=models.Childstest(oyanoid=200) 8db.add(db_child) 9db.commit() 10 11
しかし、なぜかこれが成功してしまいます。
外部キー制約が機能していればoyaテーブルに存在しない値を保存できないはずではないでしょうか?
質問は以下です。
0. oyaxとかkodomoxとかに設定したrelationshipはどこで使われているのか。(僕は最初、ForeignKey("oyax.id")のようにして使うのだと思っていたのですが、ForeignKeyの引数には"テーブル名.カラム名"をとるようです)
0. 存在しない値を登録できてしまうのは何故か。登録できないようにDBを設計する方法はあるのか。
0. relationshipの行を全てコメントアウトしてしまっても動いてしまった(登録できてしまった)が、ここはなんの意味があるのか。
質問のうち分かるものだけでも結構です。どうか教えてください
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。