簡體   English   中英

如何將 SQLAlchemy 結果行轉換為嵌套的字典

[英]How to translate SQLAlchemy result rows into nested dicts

我正在評估在 async/await FastAPI應用程序中使用 SQLAlchemy 的潛在設置。 我目前正在使用declarative_base類編寫模型和查詢,然后使用數據庫執行查詢(模型類的語法更易讀且易於編寫;直接使用 SQLAlchemy 核心表不是我最喜歡的活動)。 這一切都很好。

在這一點上,我有 SQLAlchemy 結果行,但我需要將它們轉換為通用字典,由於急切加載的關系而可能嵌套(在這種環境中我將只支持類型)。 我不能使用 SQLAlchemy 的 ORM,因為 1) 我沒有enginesession 和 2) ORM 假設它可以在需要加載對象時訪問數據庫,而在 async/await FastAPI 應用程序中則不是這種情況。

有沒有人有關於如何實現這一點的想法或指示? 我正在努力弄清楚如何將結果行與特定的關系鍵相關聯,特別是。 我一直在 Sqlalchemy 內部尋找想法,但它非常不透明,因為其中很多都假設整個層的對象緩存和會話/引擎管理在我的設置中不存在。

我可以使用想法的兩件事:

  1. 如何將列名稱(如table_1_column_name到特定模型及其屬性
  2. 如何檢測和映射關系(可能深度不止一層)

感謝您的任何幫助,您可以提供!

更新:您可以在這里找到一個可運行的示例: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM