当前位置:   article > 正文

flask怎么连接Oracle,flask 中使用连接池和 app_context 求助

python flask oracle数据库连接池

v2ex 的处女贴,奉献给 flask

刚开始学 flask ,还没时间看 sqlalchemy

python2.7 , flask 0.10.1 。数据库是 oracle ,使用了 cx_Oracle 作为驱动。

按以往的经验,在创建了一个连接池,每次有请求进行时从池子中获取获取一个 connection ,访问 db 后,把 connection release 回池中。

问题:

1 、看打出来的日志,只初始化了一次连接池,结果出来两次“ connect db ”。

2 、对于 app_context 的使用还是很困惑。

何时需要 app_context , app_context 是否是唯一的?

如何把池的信息附加到 app_context ,使在每次的 request 时都可以正确获取到。

附件 1 : db.py

import cx_Oracle as cxo

from flask import current_app

try:

from flask import _app_ctx_stack as stack

except ImportError:

from flask import _request_ctx_stack as stack

class OraDB(object):

def __init__(self, app=None):

self.app = app

if app is not None:

self.init_app(app)

def init_app(self, app):

if hasattr(app, 'teardown_appcontext'):

app.teardown_appcontext(self.teardown)

else:

app.teardown_request(self.teardown)

print 'connect db'

ctx = app.app_context()

ctx.push()

self.pool = cxo.SessionPool(user=current_app.config['DBUSER'], \

password=current_app.config['DBPASSWORD'], \

dsn=current_app.config['DSN'], \

min=current_app.config['MIN'], \

max=current_app.config['MAX'], \

increment=current_app.config['INCREMENT'], threaded=True)

def connect(self):

conn = self.pool.acquire()

print 'in connect: pool id:', id(self.pool), ' conn id:', id(conn)

return conn

def teardown(self, exception):

ctx = stack.top

if hasattr(ctx, 'oradb'):

print "teardown " + str(id(ctx.oradb))

self.pool.release(ctx.oradb)

@property

def connection(self):

ctx = stack.top

if ctx is not None:

if not hasattr(ctx, 'oradb'):

ctx.oradb = self.connect()

return ctx.oradb

附件 2 : app.py

from flask import Flask, current_app

from db import OraDB

app = Flask(__name__)

app.config.from_pyfile('config.cfg')

db = OraDB(app)

@app.route('/')

def index():

cur = db.connection.cursor()

cur.execute("select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual")

rs = cur.fetchall()

return rs[0][0]

if __name__ == "__main__":

app.run(debug=True)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/501423
推荐阅读
相关标签
  

闽ICP备14008679号