SQLAlchemy配置连接多个数据库

 1.定义配置项


首先定义两个数据库的配置信息

# PostgreSQL database configuration
DB_USERNAME=postgres
DB_PASSWORD=passord
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=test

# mysql database configuration
DB_USERNAME_MYSQL=root
DB_PASSWORD_MYSQL=password
DB_HOST_MYSQL=127.0.0.1
DB_PORT_MYSQL=3306
DB_DATABASE_MYSQL=test

2.定义Config类

首先读取上面的数据库配置项。

“db_credentials ”和“db_mysql_credentials”是我储存对应数据库配置的自定义字段,随意起名即可。

“self.SQLALCHEMY_DATABASE_URI”字段名代表sqlalchemy的主数据库,这里我使用的是postgres,里面按照文档要求填上对应的请求地址。

“self.SQLALCHEMY_BINDS”可以理解为副数据库,可以把其他数据库都写在这里,其值是dict格式。格式为{"key":"databaseUri"}。每个数据库都必须以唯一的键值区分,键值按自己喜好取就行。mysql1,mysql2,mysql3什么的....

"self.SQLALCHEMY_ENGINE_OPTIONS"代表连接池大小

“self.SQLALCHEMY_ECHO”代表sqlalchemy在每次请求时是否在控制台打印sql语句

注意:

SQLAlchemy采用的是加载对应数据库DBAP

### FastAPI 连接和管理多个数据库的实现方法 在 FastAPI 中连接和管理多个数据库可以通过自定义中间件或依赖注入来实现。以下是一个完整的解决方案,包含多数据库配置、动态数据库会话管理和示例代码。 #### 1. 配置多个数据库连接 通过 SQLAlchemy 的 `create_engine` 方法为每个数据库创建独立的引擎,并使用 `sessionmaker` 创建对应的会话工厂[^2]。 ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, declarative_base from sqlalchemy.pool import QueuePool # 数据库URL配置 DATABASE_URL_1 = "mysql+pymysql://user:password@localhost:3306/db1" DATABASE_URL_2 = "mysql+pymysql://user:password@localhost:3306/db2" # 创建数据库引擎 engine_db1 = create_engine( DATABASE_URL_1, poolclass=QueuePool, pool_size=5, max_overflow=10, pool_timeout=30, pool_recycle=1800, pool_pre_ping=True, echo=False ) engine_db2 = create_engine( DATABASE_URL_2, poolclass=QueuePool, pool_size=5, max_overflow=10, pool_timeout=30, pool_recycle=1800, pool_pre_ping=True, echo=False ) # 创建会话工厂 SessionLocalDB1 = sessionmaker(autocommit=False, autoflush=False, bind=engine_db1) SessionLocalDB2 = sessionmaker(autocommit=False, autoflush=False, bind=engine_db2) # 声明基类 BaseDB1 = declarative_base() BaseDB2 = declarative_base() ``` #### 2. 动态数据库会话管理 为了在不同的路由中动态选择数据库会话,可以创建一个通用的依赖注入函数 `get_db`,并通过参数指定需要使用的数据库[^1]。 ```python from fastapi import Depends, HTTPException, status from typing import Generator def get_db(db_name: str) -> Generator: try: if db_name == "db1": db = SessionLocalDB1() elif db_name == "db2": db = SessionLocalDB2() else: raise ValueError("Invalid database name") yield db except Exception as e: logger.error(f"Database error: {e}") raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Database connection error") finally: db.close() ``` #### 3. 路由中的依赖注入 在不同的路由中,通过传递 `db_name` 参数来动态选择数据库会话。 ```python from fastapi import FastAPI, Depends app = FastAPI() @app.get("/data-from-db1/") async def read_data_from_db1(db=Depends(lambda: get_db("db1"))): # 示例查询 result = db.query(SomeModelDB1).all() return result @app.get("/data-from-db2/") async def read_data_from_db2(db=Depends(lambda: get_db("db2"))): # 示例查询 result = db.query(SomeModelDB2).all() return result ``` #### 4. 自定义中间件(可选) 如果需要更复杂的动态数据库选择逻辑,可以创建自定义中间件,在请求处理前根据特定条件选择数据库[^1]。 ```python from fastapi import Request, Response @app.middleware("http") async def dynamic_db_selection(request: Request, call_next): # 根据请求头或路径动态选择数据库 db_name = request.headers.get("X-Database", "db1") request.state.db = get_db(db_name) response = await call_next(request) return response ``` --- ### 注意事项 - 确保每个数据库连接配置合理,避免因连接耗尽导致性能问题。 - 使用 `pool_pre_ping=True` 可以自动检测并替换失效的连接。 - 在生产环境中,建议启用日志记录以便监控数据库连接状态。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值