在python框架中使用mysql时,我遇到了一个小问题。我设置了一个函数( get_db()
)在一个请求中连接到数据库一次,并在以后(在同一个请求中)为请求它的函数提供相同的连接。
import mysql.connector #mysql-connector-python==8.0.12
def get_db():
if 'db' not in g:
try:
click.echo("Trying to connect")
cnx = mysql.connector.connect(user='stack', password='overflow',
host='127.0.0.1',
database=DB_NAME)
g.db = cnx
return g.db
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
click.echo("Connection failed! Check username and password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
click.echo("Database does not exist")
else:
click.echo("Unknown error: {} ".format(err))
else:
cnx.close()
# Connection to db cannot
# be established.
# click.echo("Will exit from database")
exit(1)
click.echo("Using existing connection")
return g.db
在其他函数中,我是这样使用的:
(...)
cnx = get_db()
cursor = cnx.cursor()
(...)
第一个使用数据库的函数可以正常工作。当另一个人试图连接 cursor
失败是因为 cnx
没有连接: raise errors.OperationalError("MySQL Connection not available.")
有人有办法处理吗?
一种解决方案是为每个函数再次创建连接,但是为了性能,如果可能的话,我宁愿重用连接。
2条答案
按热度按时间v1l68za41#
我目前得到的解决方案包括
reconnect
每次方法都需要db连接。我不知道这是否会使开销增加
connect()
但是它适合当前的用例。代码如下所示:
pdsfdshx2#
您可以使用池:https://dev.mysql.com/doc/connector-python/en/connector-python-connection-pooling.html
导入mysql.connector
在给定的链接上,还有一个关于显式池连接的示例