FastAPI 路由问题:
嗨,我已经设置了 3 个数据库(主数据库,即 postgres 实例),如下所示:
master1:
- db1:
- tables...
- db2:
- and so on...
- db3:
master2:
- db1:
- db2:
- db3:
master3:
- db1:
- db2:
- db3:
全部由 Alembic 管理,因此它们都是相同的,但我将添加错误处理。但是,每个实例中的所有数据库实际上都具有相同的名称,它不像
master1_db1 = 'abc'
和 master2_db1 = 'def'
,它们实际上都是 db1
出于所有意图和目的。
我想公开端点,如下所示:
/{master_i}/{db_j}/{tables_xyz}
这样他们就可以访问
/master1/db1/table1
,但也可以切换到 /master2/db1/table1
从不同的环境获取数据。 (这些实际上只是本地、开发和产品数据库 fwiw)。
但是逻辑不应该在
.../db1/table1
部分之间改变,事实上,我想去掉前缀{master_i}
并且只有/db1_table
的实际逻辑,然后变量{master_i}
是sql的选择器-我想使用炼金术引擎。
因此,我的 api 已在
/db1/table1/
启动并运行,但我希望用户位于 {master_i}/db1/table1
并去掉 master_i
以发送到 sql-alchemy db-engine,并且所有逻辑在 相同/db1/table1/
。
所以,当他们访问
{master_i}/db1/table1
时:
SQLAlchemy 引擎获取
{master_i}
部分
def sql_engine(passed_db_name, server_port):
db_url = URL.create(
"postgresql+psycopg2",
username = os.getenv('DB_USER'),
password = os.getenv('DB_PASS'),
host = '127.0.0.1',
port = int(server_port),
database = str(**master_i**) # <<< Where I am using the path prefix {master_i}
)
return create_engine(db_url)
FastAPI 获得
/db1/table1
@db1_router.get('/table_1')
def get_table_1():
return [{"get": "sql_alchemy_output_from_{master_i}_here"}]
我只是不想拥有相同 FastAPI 路由器/端点/函数的 3 个副本,因为它们不会有所不同。
您可以对同一个函数使用多个装饰器,如下所示:
@db1_router.get('/table_1')
@db2_router.get('/table_1')
@db3_router.get('/table_1')
def get_table_1():
return [{"get": "sql_alchemy_output_from_{master_i}_here"}]