Flask连接数据库Oracle报错
sql_lianjie.py
import cx_Oracle
class Mysql(object):
def __init__(self):
try:
self.db = cx_Oracle.connect(dsn='10.11.1.111:1111/SW_111111',user='sa', password='11111111',encoding='GBK')
self.cursor =self.db.cursor()
print('连接成功')
except Exception as e:
print('连接失败',e)
#1小时查询语句函数
def onedata(self):
sql = "SELECT * FROM (SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH FROM RWDB.ST_PPTN_R r LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD WHERE r.TM >= SYSDATE - INTERVAL '1' HOUR GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH ORDER BY SUM(r.DRP) DESC) WHERE ROWNUM <= 40"
#执行语句
self.cursor.execute(sql)
#获取所有记录
results = self.cursor.fetchall()
print(sql)
print(results)
return results
app.py
from flask import Flask, request, make_response
import openpyxl
from openpyxl.writer.excel import save_virtual_workbook
from sql_lianjie import Mysql
from io import BytesIO
from flask import jsonify, current_app, request
import time
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/index')
def index():
return render_template('index.html')
#1小时排序
@app.route('/product/list',methods=['GET','POST'])
def product_list():
db =Mysql()
# resultsenshi = db.enshidata()
resultst = db.onedata()
return render_template('productList.html',results=resultst)
报错:
127.0.0.1 - - [30/Jun/2023 16:25:28] "GET /favicon.ico HTTP/1.1" 404 -
连接失败 ORA-12537: TNS:connection closed
[2023-06-30 16:25:29,055] ERROR in app: Exception on /product/list [GET]
Traceback (most recent call last):
File "D:\PycharmProjects\testFlask\venv\lib\site-packages\flask\app.py", line 2525, in wsgi_app
response = self.full_dispatch_request()
File "D:\PycharmProjects\testFlask\venv\lib\site-packages\flask\app.py", line 1822, in full_dispatch_request
rv = self.handle_user_exception(e)
File "D:\PycharmProjects\testFlask\venv\lib\site-packages\flask\app.py", line 1820, in full_dispatch_request
rv = self.dispatch_request()
File "D:\PycharmProjects\testFlask\venv\lib\site-packages\flask\app.py", line 1796, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "D:\PycharmProjects\testFlask\app.py", line 30, in product_list
resultst = db.onedata()
File "D:\PycharmProjects\testFlask\sql_lianjie.py", line 25, in onedata
self.cursor.execute(sql)
AttributeError: 'Mysql' object has no attribute 'cursor'
127.0.0.1 - - [30/Jun/2023 16:25:29] "GET /product/list HTTP/1.1" 500 -
ip是11.11.11.111?
端口是1111?
本地ping 11.11.11.111 看下是否是连通的。
使用werkzeug.middleware.profiler.ProfilerMiddleware
中间件对Flask的每个请求进行性能分析。其使用python默认的cProfile或profile对请求入口函数wsgi_app进行性能度量从而达到分析一个请求中各部分性能的目的。wezkzeug
是实现Flask的底层包之一。
from werkzeug.middleware.profiler import ProfilerMiddleware
app.wsgi_app = ProfilerMiddleware(app.wsgi_app)
输出的形式如下
PATH: '/xxx/yyy/1'
45309 function calls (44223 primitive calls) in 0.085 seconds
Ordered by: internal time, call count
ncalls tottime percall cumtime percall filename:lineno(function)
593 0.017 0.000 0.017 0.000 {built-in method io.open}
18 0.016 0.001 0.016 0.001 {method 'recv_into' of '_socket.socket' objects}
675 0.007 0.000 0.007 0.000 {built-in method posix.stat}
ncalls
: 调用次数tottime
: 在指定函数中消耗的总时间(不包括调用子函数的时间)percall
: 是 tottime
除以 ncalls
的商cumtime
: 指定的函数及其所有子函数(从调用到退出)消耗的累积时间。这个数字对于递归函数来说是准确的。percall
: 是 cumtime
除以原始调用(次数)的商(即:函数运行一次的平均时间)filename:lineno(function)
: 提供相应数据的每个函数如果ncall
有两个数字(例如3/1),则表示函数递归。第二个值是原始调用次数,第一个是调用的总次数。请注意,当函数不递归时,这两个值是相同的,并且只打印单个数字。
Flask启动时,会调用Mysql类的初始化方法,但是此时还未连接数据库,将数据库连接初始化放在视图函数中试试,按需连接数据库会更好,没有请求时,数据库连接可以关闭
Python Flask 连接 Oracle 报错以及解决方法
可以参考下
https://blog.csdn.net/qq_43320293/article/details/131393010
错误提示product_list执行到product_list这个方法的试试报错了。错误的大概意思就是说 'Mysql' 这个对象没有 'cursor这个属性。从你的代码来看,应该是在Mysql这类的init方法中, self.cursor 这个变量没有正确初始化导致的,可能是由于你把 self.cursor = None放在了try except代码块中导致的,你把 self.cursor 的申明和定义放到try except外面看看是否可行。
用Navicat 连接试试能行不
我看了下你给的一些报错信息,你看看最后一两行的输出,如下
AttributeError: 'Mysql' object has no attribute 'cursor'
这个显然就是连接数据库的相关库的问题~~~升级一下对应连接数据库的版本,或者降级试试也可以的,多试试把,有问题再留言
ORA-12537: TNS:connection closed
:这是Oracle数据库的错误,表示尝试连接到数据库时连接被关闭。是由于网络问题、Oracle服务不可用或连接参数有误。你可以尝试以下解决方法:
user/password@hostname:port/SID
或 user/password@//hostname:port/service_name
。注意你的dsn
参数可能有误。AttributeError: 'Mysql' object has no attribute 'cursor'
:这是Python的错误,发生在尝试调用Mysql
对象的cursor
属性时。这是因为在创建数据库连接时出现异常,导致cursor
属性未能正确初始化。你应该在__init__
方法中为self.cursor
提供一个默认值以防止此错误。这种情况下,你可能要这样做:
class Mysql(object):
def __init__(self):
self.cursor = None
try:
self.db = cx_Oracle.connect('sa', 'Simple4U', '10.42.6.181:1433/SW_ES_RWDB',encoding='GBK')
self.cursor = self.db.cursor()
print('连接成功')
except Exception as e:
print('连接失败',e)
在以上代码中,self.cursor = None
可以在尝试建立连接之前提供一个默认的None
值,这样在出现连接失败的情况下,虽然无法创建cursor,但是至少可以防止在后续调用self.cursor
时抛出AttributeError。
引用chatgpt内容作答:
根据您提供的代码和错误信息,有几个问题需要注意和解决:
1、错误消息中显示连接失败,具体是ORA-12537错误,这可能是由于数据库连接配置不正确或连接被关闭导致的。请确保以下几点:
确认Oracle数据库服务正在运行,并且可以从Flask应用程序所在的主机访问该数据库。
验证数据库连接字符串中的IP地址、端口号、服务名/实例名、用户名和密码是否正确。
确保防火墙设置允许Flask应用程序访问Oracle数据库的IP地址和端口。
如果您在连接字符串中使用了特殊字符,请确保对其进行正确转义。
2、在您的sql_lianjie.py文件中,Mysql类的名称可能会引起误解,因为您正在连接的是Oracle数据库而不是MySQL数据库。建议将类名更改为OracleDB或类似的名称,以避免混淆。
3、在onedata方法中,报错显示'Mysql' object has no attribute 'cursor',这是由于在Mysql类的构造函数中,您没有为该类创建一个cursor属性。您需要在构造函数中添加以下代码:
self.cursor = self.db.cursor()
请根据上述建议进行更正,并确保数据库连接配置正确。
来自GPT的回答:
根据你提供的代码和报错信息,有几个问题可能导致连接Oracle失败和AttributeError错误:
检查Oracle数据库连接配置:
确保在cx_Oracle.connect()方法中传递的参数正确。检查IP地址、端口号、服务名等信息是否正确,并确保Oracle数据库服务器可以从你的应用程序所在的服务器访问。
检查Oracle客户端安装:
确保在运行应用程序的服务器上正确安装了Oracle客户端。Oracle客户端提供了必要的库和驱动程序,以便Python应用程序能够连接和操作Oracle数据库。
确保正确导入cx_Oracle模块:
确保已经正确安装了cx_Oracle模块,并在代码中使用import cx_Oracle导入模块。
检查数据库连接对象的属性:
报错信息中提到AttributeError: 'Mysql' object has no attribute 'cursor',这意味着在Mysql类中没有定义cursor属性。请确保在Mysql类的__init__方法中正确创建了数据库连接对象,并赋值给self.cursor。
示例修改后的Mysql类代码:
python
Copy code
class Mysql(object):
def __init__(self):
try:
self.db = cx_Oracle.connect(dsn='10.11.1.111:1111/SW_111111', user='sa', password='11111111', encoding='GBK')
self.cursor = self.db.cursor()
print('连接成功')
except Exception as e:
print('连接失败', e)
self.cursor = None
def onedata(self):
if self.cursor is None:
return []
# 执行语句
self.cursor.execute(sql)
# 获取所有记录
results = self.cursor.fetchall()
print(sql)
print(results)
return results
在上述示例中,如果连接失败,则将self.cursor设置为None,并在onedata方法中检查该属性,以避免出现AttributeError错误。
请注意,以上是一些可能导致问题的常见原因和解决方法。如果问题仍然存在,请进一步检查服务器和网络配置,确保所有必要的依赖项已正确安装,并确认可以通过其他方式成功连接到Oracle数据库。