背景
自己的fastapi服务,需要连接不同的数据库实例支持多维度业务.查阅了官方文档,也在网上找了很久,也没有找到直接可以采用的方案,既然找不到,那就自己来
首先,连接多数据库,配置多套数据库连接,实现不同的db实例对象即可实现.然后在不同的router中分别调用.low否?那能不能有一个公共的get_db.供不同的router依赖注入,来完成动态的创建dbSession对象呢?
方案
我们需要根据定义的路由去区分要连接的数据库,那么如何获取请求的路由呢?是不是可以用中间件来拦截请求的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]