[英]How to translate SQLAlchemy result rows into nested dicts
我正在評估在 async/await FastAPI應用程序中使用 SQLAlchemy 的潛在設置。 我目前正在使用declarative_base
類編寫模型和查詢,然后使用數據庫執行查詢(模型類的語法更易讀且易於編寫;直接使用 SQLAlchemy 核心表不是我最喜歡的活動)。 這一切都很好。
在這一點上,我有 SQLAlchemy 結果行,但我需要將它們轉換為通用字典,由於急切加載的關系而可能嵌套(在這種環境中我將只支持類型)。 我不能使用 SQLAlchemy 的 ORM,因為 1) 我沒有engine
或session
; 和 2) ORM 假設它可以在需要加載對象時訪問數據庫,而在 async/await FastAPI 應用程序中則不是這種情況。
有沒有人有關於如何實現這一點的想法或指示? 我正在努力弄清楚如何將結果行與特定的關系鍵相關聯,特別是。 我一直在 Sqlalchemy 內部尋找想法,但它非常不透明,因為其中很多都假設整個層的對象緩存和會話/引擎管理在我的設置中不存在。
我可以使用想法的兩件事:
table_1_column_name
到特定模型及其屬性感謝您的任何幫助,您可以提供!
更新:您可以在這里找到一個可運行的示例: https ://gist.github.com/onecrayon/dd4803a5099061fa48d52f2d4bc2396b(有關我需要弄清楚如何通過映射將 RowProxy 轉換為嵌套字典的相關位置,請參閱第 92-109 行查詢列名稱到 SQLAlchemy 模型上的名稱)。
如果你是 db first,sqlalchemy execute 方法通常會返回一個Result Proxy對象,你可以通過它的方法獲取它的結果,例如 fetchone、first、fetchall,然后將其轉換為 list 或 dict。 你也可以看到這個碼頭
如果結果是原始 SQLAlchemy 行而不是 ORM 映射實例, 則將對象轉換為 dict應該可以工作。
從您對另一個答案的評論來看,您似乎需要將結果映射回 ORM 實例。 您可以定義聲明性映射,以便將結果轉換回 Python 實例。
SQLALchemy 對象有一個選項可以作為 dict 返回——這里是 SQLALchemy 源文檔來幫助你。 https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.util.KeyedTuple._asdict
或者你可以使用https://pythonhosted.org/dictalchemy ,它作為 SQLALchemy 之上的包裝器。
希望有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.