【问题标题】:Multiple Database connections using fastapi使用 fastapi 的多个数据库连接
【发布时间】:2022-07-21 17:37:21
【问题描述】:

我是 FAST API 的新手,对此了解不多。我想连接多个数据库。 我试图通过https://github.com/tiangolo/fastapi/issues/2592 但无法理解该方法。我也很好奇如何从数据库中获取数据并更新数据库中的值。 如果有人可以帮助我,那就太好了,还有其他可以完成这项工作的示例或方法吗?

【问题讨论】:

  • 您链接的问题表明您可以创建两个引擎并将模型明确链接到每个引擎。你不明白的答案是什么?您还可以有两个依赖项(即get_dbget_db_alternative)并根据您的需要产生不同的会话。
  • @MatsLindh 1) as_declarative 的作用 2) 我将如何从数据库中获取数据并更新数据库中的值
  • as_declarative 允许您将类标记为 SQLAlchemy 中的声明性基类,以便您可以创建从 Model1DBModel2DB 继承的模型,基于模型所在的 DB (而不是使用Base)。对于查询和更新,它将取决于您如何定义模型或计划在 SQLAlchemy 中使用查询或表对象。这些是一般的 SQLAlchemy 问题;即docs.sqlalchemy.org/en/14/core/dml.html 是了解如何针对引擎或会话运行查询的好资源。
  • @MatsLindh 感谢您的帮助

标签: sqlalchemy fastapi


【解决方案1】:

自己做中间件。这是我的例子:

扩展 BaseHTTPMiddleware 过滤您的路由器名称并在您的环境中设置 database_url。

class DatabaseSelector(BaseHTTPMiddleware):
def __init__(self, app):
    super().__init__(app)

async def dispatch(self, request: Request, call_next):
    url_param = str(request.url).split("/")
    if "api" in str(request.url):
        url_param.remove("api")
    route_name = url_param[3]
    if route_name not in list(routeMap.keys()):
        SQLALCHEMY_DATABASE_URI = routeMap["base_mysql"]
    else:
        SQLALCHEMY_DATABASE_URI = routeMap[route_name]
    os.environ["SQLALCHEMY_DATABASE_URI"] = SQLALCHEMY_DATABASE_URI
    response = await call_next(request)
    return response

让你的配置参数像这样:

routeMap = {
"base_mysql": 'mysql+pymysql://{}:{}@{}:{}/{}'.format(*BaseMysql.values()),
"show_data": 'mysql+pymysql://{}:{}@{}:{}/{}'.format(*RequestMysql.values()),
"else_data": "xxxxxxx",

}

同时发送 http 请求。您可以根据此 routeMap 获取您的路由器名称

def get_db():
SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI')
engine = create_engine(SQLALCHEMY_DATABASE_URI, echo=True, pool_size=50)
SessionLocal = sessionmaker(bind=engine)
db = SessionLocal()
try:
    yield db
finally:
    db.close()

最后,您只需调用 get_db,而无需关心您将连接哪个数据库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多