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

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值