在Flask框架的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.")
有人能解决这个问题吗?
一种解决方案是为每个功能再次创建连接,但是出于性能考虑,我宁愿重用连接。
答案 0 :(得分:0)
我当前最终得到的解决方案在每次方法需要数据库连接时都涉及一个reconnect
。
我不知道这是否会获得connect()
的开销,但它适合当前的用例。
代码如下:
def get_db():
if 'db' not in g:
try:
cnx = mysql.connector.connect(user='tom', password='jerry',
host='127.0.0.1',
database=DB_NAME)
g.db = cnx
click.echo("Returns new connection")
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))
cnx = g.db
cnx.reconnect() <--- Doing a reconnect each time
return cnx
答案 1 :(得分:0)
您可以使用缓冲池:https://dev.mysql.com/doc/connector-python/en/connector-python-connection-pooling.html
导入mysql.connector
conf = {"user":"username", "password":"*****", host="hostname"}
pool_cnc = mysql.connector.connect(pool_name="my_pool", **conf)
# Take one connection using the name of the pool:
cnc1 = mysql.connector.connect(pool_name = pool_cnc.pool_name)
cnc1.is_connected()
# Should output True
在给定的链接上,还有一个有关显式池连接的示例