FastAPI url 前缀用于切换数据库?

问题描述 投票:0回答:1

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 个副本,因为它们不会有所不同。

sqlalchemy fastapi prefix multiple-databases
1个回答
0
投票

您可以对同一个函数使用多个装饰器,如下所示:

@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"}]
© www.soinside.com 2019 - 2024. All rights reserved.