2017-09-18 11 views
0

を使用して、異なるテーブルの別の列を参照のI持って次のシナリオ、SQLAlchemyのORM

Iが「シリアル」タイプの主キーを持っているテーブル(TABLE1)に挿入する必要が
  1. 外部キーとしてtable1の主キーを含む別のテーブル(table2)に挿入する必要があります。
  2. 今両方同じトランザクション内で行われる挿入および生成された主キーは、表2

を査読する必要がありますが、私たちは、私はこのコードtable1idが走ったとき、私は

Base = declarative_base() 

class Table1(Base): 
    __tablename__ = 'table1' 
    table1id= Column(Integer, primary_key=True) 
    name = Column(String) 

class Table2(Base): 
    __tablename__ = 'table2' 
    table2id= Column(Integer, ForeignKey('table1.table1id')) 
    name = Column(String) 
# 
table1 = Table1(name='abc') 
table2 = Table2(table2id=table1.table1id) 
session.add(table1) 
session.add(table2) 
session.commit() 

をしようとしたものをお見せしましょうテーブル1に15として挿入されていますが、表2では 'null'と表示されています。

答えて

1

Pythonでモデルオブジェクトを作成すると、モデルオブジェクトはまだDBにフラッシュされません。シリアル列の場合、DBは新しい値を生成するため、生成前にはNoneになります。声明

table2 = Table2(table2id=table1.table1id) 

では、単にNoneことを読んで、 table2idキーワード引数として渡します。あなたがあなたの操作ビットの順序を変更する必要がありますので、データベースへの変更をflushする必要がある値を得るために:あなたがしたい場合

table1 = Table1(name='abc') 
session.add(table1) 
# Flush the changes to the DB 
session.flush() 
table2 = Table2(table2id=table1.table1id) 
session.add(table2) 
session.commit() 

SQLAlchemyのは、多かれ少なかれ自動的にあなたのためにこれのほとんどをも行うことができ表1と表2の間にrelationshipsを定義するか、またはこれが実際にinheritance hierarchyの場合は定義します。

+0

ありがとうございました.. –

+0

しかし、最初の挿入がロールバックされたかどうかにかかわらず、2番目の挿入が失敗したときに1つのクエリがありますか? –

+1

フラッシュはコミットではありません。現在のSQLAセッションの未送信の変更をデータベースに送信します(挿入などを発行します)。通常、SQLAは自動フラッシュによる裏口のフラッシュを処理しますが、このような場合は明示的にする必要があります。 –