You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:56:18