2 つの Python クラスNote
とLink
PostgresQL テーブルへのマッピングがあります。 Note
は への外部キー参照を持っていますが、JSON テキストの一部を介してノードLink
をLink
指しています。リンクは s 以外のものを指しますNote
が、それはここでは問題ではありません。
Note
+------+------------------+---------+
| ID | NAME | NOTE_ID |
+------+------------------+---------+
| 1 | Alice | 5 |
| 2 | Bob | 20 |
| 3 | Carla | 6 |
+------+------------------+---------+
Link
+------+--------------+
| ID | CONTENT |
+------+--------------+
| ... | ... |
| 5 | {"t":1} |
| 6 | {"t":3} |
| ... | ... |
| 20 | {"t":2} |
+------+--------------+
今私が望むのは、新しいものを作成するたびにNote
note = Note('Danielle')
自動的に行に入ります
(4, 'Danielle', 21)
にNote
、そして入力します
(21, '{"t":4}')
にLink
。これが私がこれまでに試したことです:私はNote
オブジェクトを作成しLink
、次に@events.after_insert
イベントで作成しようとします:
class Note(Entity):
name = Field(Unicode)
link = ManyToOne('Link')
. . .
@events.after_insert
def create_link(self):
"""
Create and persist the short link for this note. Must be done
in this after_insert event because the link table has a foreign
key that points back to the note. We need the note to be
already inserted so we can use its id.
"""
self.link = Link.build_link_for_note(self)
elixir.session.flush()
print("NOTE %s GOT LINK %s" % (self, self.link))
私が持っているリンククラスで
class Link(Entity):
. . .
@classmethod
def build_link_for_note(cls, note):
return Link(content='{"id": %d}' % note.id)
どちらのテーブルにも自動インクリメントされた主キーがあるため、心配する必要はありません。このコードで発生するエラーは次のとおりです。
File ".../sqlalchemy/orm/session.py", line 1469, in flush
raise sa_exc.InvalidRequestError("Session is already flushing")
InvalidRequestError: Session is already flushing
私はそれを買います。現在のセッションのフラッシュ中に発生した、メモがデータベースに保存された後@after_insert
、イベントが呼び出されます(私は思います) 。そしてもちろん、通話を削除すると、もちろん印刷されますelixir.session.flush()
NOTE <Note id:4 name:Danielle> GOT LINK <id:None content:{"t": 4}>
リンクを永続化できなかったので、これも理にかなっています!
私の質問は、相互に依存する ID が利用可能で適切に記録されるように、単一のリクエストでメモとリンクの両方を作成するにはどうすればよいですか?
PS ここでのスキーマは少し変わっていることを理解しています。この問題は、(1) タスクを生成してリンクを非同期的に作成するか、(2)Link.content
メソッドにリンクを遅延作成させることで解決できることを理解しています。これらのソリューションには並行性に注意を払う必要があるため、1 つのセッションを使用する単純で直接的な SQLAlchemy ソリューションが機能することを本当に望んでいます。