Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

SQLAlchemy2.0スタイルメモ〜scalars〜

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オンリーに早くなりたい。