REST 会话的 SQLAlchemy 最佳实践 API

SQLAlchemy best practices with sessions for REST API

我使用 openapi 生成器创建了一个 rest API,其中包含选择、插入和更新我的 SQL 数据库所需的所有请求。

我使用我的数据库生成和操作 SQLAlchemy,但我不确定如何使用会话在此上下文中与数据库交互。

我的项目是这样的:

DB
| openapi_server (generated)
| __init__.py
| request.py
| database.py

database.py中,我保留我的数据库结构。

request.py中,我有所有需要在每个请求上处理的函数(与数据库交互)。

我的处理方法是:我在每个函数的开头创建一个session变量,运行完成后关闭。

任何其他更具可扩展性和易于维护的方法或者哪些是最佳实践?

我的理解是,sqlalchemy 会话与客户端会话的不同之处在于,客户端会话存储有关授权和权限的信息,而 sqlalchemy session is a gil-bound transaction state 将您的代码/机器关联到外部数据库。

假设您没有使用多线程或并行处理,那么在您的应用程序之间共享一个 sqlalchemy 会话是合适的。如果您的用户具有不同级别的数据库权限,我会在您的应用程序授权中建立这些规则,而不是数据库用户权限模式。 (应该为系统用户保留。)

请记住,多个 sqlalchemy 会话适用于许多场景,并且动态创建和关闭会话具有优势。但是也有潜在的缺点,比如写冲突(2个进程试图写同一条记录)等等。在这些更细粒度的情况下,我建议将排队过程作为中央协调器。

实现:
我一般都是创建一个文件create_session.py 具有使用适当的数据库 URI 创建新数据库会话的功能。然后我在主 __init__.py 中调用该函数,如下所示:session = create_session() --> 在整个应用程序中导入该会话是通过从主模块 ex 导入会话来完成的:from database import session.

如果您需要创建新的/多个会话,请使用:

# Getting the path right here isn't always straightforward tbh
# basically, import the function from the module directly
from create_session import create_session
def do_something():
    # Always create your session in a method
    # otherwise your db will open many unnecessary connections 
    my_session = create_session()
    
    print('Done')
    # Close the session when you're done
    my_session.close()