如何在python flask中使用mysql.connection数据库池

如何在python flask中使用mysql.connection数据库池,python,mysql,flask,Python,Mysql,Flask,我在mysql 5.6中使用Flask10.1。我希望有一个连接池,每个请求可以在其中获取连接并并行插入数据。我认为应该使用的代码是: # !flask/bin/python from flask import Flask, jsonify, abort, make_response, request, g import mysql.connector app = Flask(__name__) db_user = "user" db_pass = "pass" db_url = "127.

我在mysql 5.6中使用Flask10.1。我希望有一个连接池,每个请求可以在其中获取连接并并行插入数据。我认为应该使用的代码是:

# !flask/bin/python
from flask import Flask, jsonify, abort, make_response, request, g
import mysql.connector

app = Flask(__name__)

db_user = "user"
db_pass = "pass"
db_url = "127.0.0.1"


@app.before_first_request
def before_first_request():
    # configure the connection pool in the global object
    g.cnx_pool = mysql.connector.pooling.MySQLConnectionPool(pool_name="name",
                                                             pool_size=10,
                                                             autocommit=True,
                                                             user=db_user,
                                                             password=db_pass,
                                                             host=db_url,
                                                             database='db')

@app.route('/log', methods=['POST'])
def log_data():
    """
    Logs data
    """
    cursor = g.cnx_pool.get_connection().cursor()
    query = """INSERT INTO db.data (time,data) values (NOW(),%s)"""
    cursor.execute(query, (request.get_data(),))
    return make_response('', 200)

if __name__ == '__main__':
    app.run(debug=True)
但是,我存储在g中的全局连接池对象似乎正在被清理。例如,当我调用rest端点时,我看到:

Traceback (most recent call last):
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request    
rv = self.dispatch_request()
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/myuser/sandboxes/myapp-server-logger/app.py", line 45, in log_user_data
    cursor.execute(query, (username, request.get_data()))
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/mysql/connector/cursor.py", line 463, in execute
    if self._have_unread_result():
  File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/mysql/connector/cursor.py", line 288, in _have_unread_result
    return self._connection.unread_result
ReferenceError: weakly-referenced object no longer exists

我是flask的新手,这是存储连接池对象的错误方法吗?

问题是,在使用光标之前,数据库连接正在被清理并返回到池中。使用光标时,必须将连接保持在范围内。这似乎是mysql.connector python中的一个设计缺陷,光标应该保留对连接对象的强引用

更改此行:

cursor = g.cnx_pool.get_connection().cursor()
对此

conn = g.cnx_pool.get_connection()
cursor = conn.cursor()
你可以这样试试

代码示例为:

app.config.update(
    DEBUG=False,
    MYSQL_DATABASE_HOST='10.95.130.***',
    MYSQL_DATABASE_PORT=8899,
    MYSQL_DATABASE_USER='root',
    MYSQL_DATABASE_PASSWORD='******',
    MYSQL_DATABASE_DB='flask',
    MYSQL_USE_POOL=
    {
        #use = 0 no pool else use pool
        "use":0,
        # size is >=0,  0 is dynamic pool
        "size":10,
        #pool name
        "name":"local",
    },
)
mysql = MySQL()
mysql.init_app(app)

很抱歉这么说,但这不是一个缺陷。正如python mysql连接器上的[official documentation][1]所述,池连接总是在关闭后返回池。您可以尝试的是:
g.cnx\u池。获取连接().cursor()。执行(查询,(请求。获取数据())
当您使用
cursor=g.cnx\u池。获取连接().cursor()
时,您的连接将在光标完成后立即返回。使用我的方法,它应该在执行后返回。