Python中使用Bottle框架连接Oracle数据库的实现方法问询
使用Bottle连接Oracle数据库的正确姿势
嘿,先纠正一个小误解:Bottle本身并没有被限制只能连接SQLite——它只是自带了针对SQLite的轻量扩展(bottle.ext.sqlite),但这完全不影响你用其他数据库驱动连接Oracle。下面是两种最常用的实现方式,你可以根据自己的场景选择:
方式一:直接在请求中调用oracledb(原cx_Oracle)
这是最直接的方案,适合小型项目或者数据请求频率不高的场景。现在Oracle官方已经推荐使用oracledb替代旧的cx_Oracle,用法差不多,先装包:pip install oracledb,然后直接在路由处理函数里建立连接、查询数据:
from bottle import Bottle, template import oracledb app = Bottle() # 把数据库配置抽出来,方便后续修改 DB_SETTINGS = { "user": "你的Oracle用户名", "password": "你的密码", "dsn": "数据库地址:端口/服务名" # 比如 'localhost:1521/ORCL' } @app.route('/show-oracle-data') def fetch_data(): # 用with语句自动管理连接和游标,不用手动关闭 with oracledb.connect(**DB_SETTINGS) as conn: with conn.cursor() as cursor: cursor.execute("SELECT id, name, create_time FROM your_table WHERE rownum <= 20") data = cursor.fetchall() # 把数据传给模板做可视化渲染 return template('data_visual', dataset=data) if __name__ == '__main__': app.run(debug=True)
如果你的请求频率比较高,每次创建连接会有性能开销,那可以用oracledb自带的连接池来优化:
# 在app启动时初始化一次连接池,不用每次请求都创建 db_pool = oracledb.create_pool( **DB_SETTINGS, min=2, # 最小空闲连接数 max=10 # 最大连接数 ) @app.route('/show-oracle-data') def fetch_data(): # 从连接池获取连接,用完自动归还 with db_pool.acquire() as conn: with conn.cursor() as cursor: cursor.execute("SELECT id, name, create_time FROM your_table WHERE rownum <= 20") data = cursor.fetchall() return template('data_visual', dataset=data)
方式二:封装成Bottle风格的插件/钩子(简化重复代码)
如果很多路由都需要访问Oracle,不想每次都写连接代码,可以用Bottle的hook钩子来自动管理连接的创建和关闭,类似SQLite扩展的用法:
from bottle import Bottle, template, request, hook import oracledb app = Bottle() DB_SETTINGS = {"user": "...", "password": "...", "dsn": "..."} db_pool = oracledb.create_pool(**DB_SETTINGS, min=2, max=10) # 请求开始前自动获取连接,绑定到request.db @hook('before_request') def setup_db_connection(): request.db = db_pool.acquire() # 请求结束后自动关闭连接,归还到池子里 @hook('after_request') def close_db_connection(): request.db.close() @app.route('/show-oracle-data') def fetch_data(): # 直接用request.db获取连接,不用重复写连接代码 cursor = request.db.cursor() cursor.execute("SELECT id, name, create_time FROM your_table WHERE rownum <= 20") data = cursor.fetchall() cursor.close() return template('data_visual', dataset=data)
总结一下
Bottle本身对数据库类型没有限制,你完全不需要依赖它的SQLite集成功能来连接Oracle。两种方案各有优劣:
- 直接调用驱动:简单直观,适合小型项目;
- 连接池+钩子:减少重复代码,性能更优,适合频繁访问的场景。
内容的提问来源于stack exchange,提问作者orangutangas
相关产品推荐
相关产品推荐

