python3 flask 使用连接池

发布时间:2019-10-17 09:07:42编辑:auto阅读(2605)

    在真实的线上环境连接数据库一般都是要使用连接池的,连接池统一管理数据库连接,可以提高应用性能。
    python数据库连接池可以使用dbutils和PySQLPool但是这两个库似乎都只支持python2不支持python3,最后折腾了半天,Python3最后我使用的是sqlalchmey里的连接池工具sqlalchemy.pool,把连接池应用到flask,我使用的是下面的方式,个人认为比较合理

    from flask import Flask, _app_ctx_stack, current_app
    import MySQLdb
    import sqlalchemy.pool as pool
    
    app = Flask(__name__)
    app.config.from_pyfile('config.py')
    
    
    @app.teardown_appcontext
    def close_database_connection(error=None):
        con = getattr(_app_ctx_stack, 'database', None)
        if con:
            con.close()
    
    
    def getconn(db_conf=None):
        if db_conf is None:
            db_conf = current_app.config['DB_CONFIG']
        conn = MySQLdb.connect(**db_conf)
        return conn
    
    mypool = pool.QueuePool(getconn, max_overflow=10, pool_size=5)
    app.db_pool = mypool
    
    
    def get_db():
        ctx = _app_ctx_stack.top
        con = getattr(ctx, 'database', None)
        if con is None:
            con = current_app.db_pool.connect()
            ctx.database = con
        return con
    
    
    @app.route('/')
    def index():
        con = get_db()
        cursor = con.cursor(cursorclass=MySQLdb.cursors.DictCursor)
        rv = cursor.execute('select 1')
        return str(rv)
    
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', debug=True, port=5001)
    
    
    

    因为sqlalchemy里有连接池模块,直接使用下面的方式在需要的地方导入db我猜测也是连接池的管理方式,未测试

    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    db.init_app(app)
    ....

关键字