FastAPIならasync
で全部行きたいねってことで、プロダクトのコードをFlask→FastAPIに書き直している。
で、簡単なクエリの動作確認で、こんなコードを書く。
async def get_posts(db: AsyncSession) -> List[Post]: result: Result = await db.execute(select(Post).order_by(Post.postdate.desc()).limit(20)) return result.all()
この時、JSONになった文字列を見ると、こういう感じで返ってくる。
{ "Post": { "id": 1, "title": "aaa", } }
なんだこのPost
とかいうエンティティ名は。そんなのいらん。何だこれって思って公式見たら、こうやって書くらしい。
async def get_posts(db: AsyncSession) -> List[Post]: result: Result = await db.execute(select(Post).order_by(Post.postdate.desc()).limit(20)) return result.scalars().all()
こうすると、JSONにした時にエンティティ名のPost
が外されて、{"id":1,"title":"aaa"}
になった。select
関数の中で、配列でカラム名を指定する場合にscalars
を使うと、選んだカラムの1つしか返ってこない。まぁ、スカラー値だもんな。オブジェクトの場合はオブジェクトが返り、Selectした場合は最初の値が返ってくる・・・ってなんだこれ。でも、Alchemy使う以上は従うしか無いし。TypeScriptオンリーに早くなりたい。