【问题标题】:How to pass database session to Ariadne in Fastapi如何在 Fastapi 中将数据库会话传递给 Ariadne
【发布时间】:2021-12-30 15:43:51
【问题描述】:

我是 python 新手,正在尝试学习和使用 Fastapi、Ariadne 和 SQLAlchemy。我正在关注文档,但我被卡住了。

对于普通的 REST 请求,我有我的依赖注入 get_db(),它提供了一个 Session 对象,我从请求开始到我实际执行 db 工作之前通过几个不同的模块,老实说,我没有得到这个设计.但我把它留在那里了。

然后,另一个问题出现了。如何将 db 传递给 Ariadne GraphQL?我应该使用context_value 还是有其他选择?

【问题讨论】:

  • Ariadne 是否直接与 SQLAlchemy 集成?我找不到任何相关信息 - 似乎您会编写 graphql 解析器,然后查询数据库以解析解析该特定节点所需的信息。
  • @MatsLindh 我有解析器和一切。我用烧瓶启动并运行它,然后决定迁移 fastapi。现在在 fastapi 上,似乎需要将 db 对象作为参数传递给 graphql,目前我正在为此使用 context_value。但我想知道是否还有其他选择?

标签: sqlalchemy fastapi ariadne-graphql


【解决方案1】:

您需要从 ariadne 解析器创建一个 SQLAlchemy 会话。并且不要忘记在解析器完成后关闭连接。

假设您的数据库文件如下所示,

import os

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = os.getenv("DB_CONN_STRING")

engine = create_engine(SQLALCHEMY_DATABASE_URL)
LocalSession = sessionmaker(autocommit=False, autoflush=False, bind=engine)

def get_db():
    db = None
    try:
        db = LocalSession()
        yield db
    finally:
        if db:
            db.close()
  • 您可以在解析器上执行以下操作
# Import the local session from local database file
from app.database import LocalSession

db = LocalSession()
# Do whatever you need to do
db.close()

【讨论】:

  • 感谢您的回答,我在发布问题后也想到了这个,但这是一个好习惯吗?
  • 是的。它只会与数据库创建更多连接。您必须在最后关闭连接并且发生任何异常
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多