我正在将 Flask 与 MySQL (MariaDB) 数据库一起使用。为了处理 sql 连接和游标,我使用自制的上下文管理器。我在每个 Flask http 请求 hadling 函数中打开和关闭连接,所以我可以确定到 db 的连接数不会超过特定数量,但它会产生开销。我确信其他用户可以使用相同的 mysql 连接,如果我不使用 ORM,我可以使用什么其他方法来处理 sql 连接和游标?
用于挂起光标和连接的上下文管理器:
from contextlib import contextmanager
import mysql.connector
from mysql.connector.errors import Error
@contextmanager
def mysql_connection(user, password, host, database, auth_plugin):
_conn = mysql.connector.connect(user=user, password=password, host=host, database=database, auth_plugin=auth_plugin)
try:
yield _conn
except (Exception, Error) as ex:
# if error happened all made changes during the connection will be rolled back:
_conn.rollback()
# this statement re-raise error to let it be handled in outer scope:
raise
else:
# if everything is fine commit all changes to save them in db:
_conn.commit()
finally:
# close connection to db, do not wait for timeout release:
_conn.close()
@contextmanager
def mysql_curs(user, password, host, database, auth_plugin) -> "curs":
with mysql_connection(user=user, password=password, host=host, database=database, auth_plugin=auth_plugin) as _conn:
_curs = _conn.cursor()
try:
yield _curs
finally:
_curs.close() # close cursor when everything is done
编辑:我想补充一点,我发现以下文章讨论了如何将 Flask 与 PostgreSQL 一起使用并创建自定义的 sql 连接上下文管理器,但我有疑问在 Flask 中我应该在哪里声明 sql 连接器池:
在 Flask 中管理 RAW 数据库连接池
冉冉说
小唯快跑啊
相关分类