スレッドが個別のテーブルではなく、投稿の複合主キーを持つフラットなフォーラムを作成したいと考えています。
そのため、投稿には自然キーを形成する 2 つのフィールドがあります:thread_id
とpost_number
。さらに、投稿が属するスレッドの ID であり、後者はスレッド内での位置です。確信が持てない場合は、行の下を確認してください。
私の問題は、SQLAlchemy に伝える方法がわからないことです
Post
thread_id を使用して新しいインスタンスの追加をコミットするときは、tid
thread_idtid
が存在する投稿の数を調べ、その数から自動インクリメントします。
スキーマが良いアイデアだと思うのはなぜですか? それは自然でパフォーマンスが高いからです。
class Post(Base):
number = Column(Integer, primary_key=True, autoincrement=False, nullable=False)
thread_id = Column(Integer, primary_key=True, autoincrement=False, nullable=False)
title = Column(Text) #nullable for not-first posts
text = Column(Text, nullable=False)
...
PAGESIZE = 10
#test
tid = 5
page = 4
スレッド全体 (クエリ):
thread5 = session.query(Post).filter_by(thread_id=5)
スレッドのタイトル:
title = thread5.filter_by(number=0).one().title
スレッドページ
page4 = thread5.filter(
Post.number >= (page * PAGESIZE),
Post.number < ((page+1) * PAGESIZE)).all()
#or
page4 = thread5.offset(page * PAGESIZE).limit(PAGESIZE).all()
ページ数:
ceil(thread5.count() / PAGESIZE)