Flask 连接Oracle报错。连接失败
import cx_Oracle
class Mysql(object):
def __init__(self):
try:
self.db = cx_Oracle.connect(host='11.11.11.111',
port='1111',
user='11',password='11111',
database='1111111',
charset='GBK')
self.cursor =self.db.cursor()
print('连接成功')
except:
print('连接失败')
#1小时查询语句函数
def onedata(self):
sql = "select * from (select r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= sysdate - interval '1' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc) t where RN<41"
#执行语句
self.cursor.execute(sql)
#获取所有记录
results = self.cursor.fetchall()
print(sql)
print(results)
return results
报错
连接失败 'host' is an invalid keyword argument for this function
ip是11.11.11.111?
端口是1111?
本地ping 11.11.11.111 看下是否是连通的。
Python Flask 是一个常用的Web开发框架,而 Oracle 数据库是企业级应用中常用的数据库之一。在使用 Python Flask 进行开发时,连接 Oracle 数据库可能会遇到各种报错。本文将介绍一些常见的 Python Flask 连接 Oracle 报错情况及其解决方法。
一、Oracle 数据库连接准备工作
在开始解决报错之前,确保以下准备工作已经完成:
确认已正确安装并配置了 Python 环境以及 Flask 框架。
确认已正确安装了 cx_Oracle 模块,它是连接 Oracle 数据库的必要模块。
二、常见报错及解决方法
ImportError: DLL load failed: 找不到指定的模块
这个报错通常发生在导入 cx_Oracle 模块时,原因是在系统中没有找到相应的 Oracle 客户端库。
解决方法:
确认已正确安装了 Oracle 客户端库,并将其路径加入系统环境变量。
确保 cx_Oracle 模块版本与 Oracle 客户端库版本匹配。
cx_Oracle.DatabaseError: ORA-12541: TNS:no listener
这个报错表示无法连接到 Oracle 数据库,原因可能是 Oracle 服务未启动或监听器配置有问题。
解决方法:
确认 Oracle 服务已启动。
检查监听器配置,确保数据库连接信息正确。
cx_Oracle.DatabaseError: ORA-12154: TNS:could not resolve the connect identifier specified
这个报错表示无法解析指定的连接标识符,原因通常是连接字符串不正确或缺少相应的配置。
解决方法:
检查连接字符串是否正确,包括主机名、端口号、服务名等。
确保 tnsnames.ora 文件中有正确的数据库连接配置,并配置了正确的别名、主机名、服务名等信息。
cx_Oracle.DatabaseError: ORA-01017: invalid username/password; logon denied
这个报错表示用户名或密码不正确,无法进行数据库登录。
解决方法:
检查用户名和密码是否正确。
确保连接字符串中的用户名和密码正确,例如使用 user/password@host:port/service_name 形式进行连接。
其他常见报错
在连接 Oracle 过程中,还可能遇到其他各种报错,如网络超时、权限问题等。解决这些报错需要具体情况具体分析,可参考相关报错信息并进行逐一排查及处理。
三、避免报错的建议
确保 Python、Flask、cx_Oracle 的版本兼容性。
配置正确的 Oracle 客户端库以及相关环境变量。
确认 Oracle 服务已启动并监听器配置正确。
检查连接字符串、用户名和密码的正确性。
根据报错信息进行逐一排查,如网络、权限等问题。
结论:
在使用 Python Flask 连接 Oracle 数据库时,报错是常见的情况。本文介绍了一些常见的报错及其解决方法,包括导入 cx_Oracle 模块失败、无法连接到数据库、连接标识符解析问题以及用户名或密码验证失败等。同时,我们提供了一些建议以避免这些报错,并确保顺利连接到 Oracle 数据库。无论是版本兼容性、环境配置,还是网络和权限等问题,耐心分析和排查,将有助于解决这些报错并成功连接 Oracle 数据库。
把host=去掉试一试
传递了无效的关键字参数,或者函数本身不支持该参数导致
给连接字符串,字符编码改成UTF-8试试。charset='utf8'
这个错误是因为在使用cx_Oracle连接Oracle数据库时,使用了错误的参数名。正确的参数名应该是dsn而不是host。所以可以将host改为dsn,如下所示:
self.db = cx_Oracle.connect(dsn='11.11.11.111:1111/1111111', user='11', password='11111', charset='GBK')
其中,dsn参数的格式为:host:port/service_name,其中host为数据库服务器IP地址,port为监听端口号,service_name为数据库实例名。
问题点: 调用connect函数时,使用了错误的参数.
解决方法:
一般的数据库连接方法为 con = cx_Oracle.connect("用户名/密码@IP:端口号/SERVICE_NAME")
连接数据库的常用两种方式
方式一:用户名、密码和监听写在一起
import cx_Oracle
db=cx_Oracle.connect('username/password@host/orcl')
db.close()
方式二:用户名、密码和监听分开写
import cx_Oracle
db=cx_Oracle.connect('username','password','host/orcl')
db.close()
标准示例
dsn参数就这几个,host、port、service_name逐个排查下,应该有错
这样试试
SQLAlchemy 连接方式(flask_sqlalchemy连接多个数据库)
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from datetime import datetime
import cx_Oracle
app = Flask(__name__)
dsnStr = cx_Oracle.makedsn('ip', 1521, service_name='orcl')
connect_str = "oracle://%s:%s@%s" %('usename', ' password', dsnStr)
# 配置多个数据库连接
SQLALCHEMY_BINDS = {
'db1': 'mysql+pymysql://root:password@ip:3306/test?charset=utf8',
'db2': 'oracle://username:password@ip:1521/orcl' #
# "db3": connect_str #oracle 连接方式二
}
app.config['SQLALCHEMY_DATABASE_URI'] = "" # 默认数据库引擎
app.config['SQLALCHEMY_BINDS'] = SQLALCHEMY_BINDS
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
engine = db.get_engine(bind="db2")
datas = engine.execute(f"select * from user where ID = '{'1'}'")
source = [dict(i) for i in datas]
print(source)
错误提示你数据库的连接方法cx_Oracle.connect中,host参数是无效的参数,你应该查阅下连接Oracle的这个方法,需要哪些参数,按住ctr,然后鼠标点击connect方法可以看到该方法的源码,里面有参数的说明和要求,根据资料,应该是dsn参数,而不是host参数。
import cx_Oracle
class Mysql(object):
def __init__(self):
try:
self.db = cx_Oracle.connect(
dsn='11.11.11.111:1111/1111111',
user='11',
password='11111',
charset='GBK'
)
self.cursor = self.db.cursor()
print('连接成功')
except:
print('连接失败')
引用chatgpt内容作答:
你在尝试使用cx_Oracle将Flask连接到Oracle时遇到的错误可能有几个原因。以下是一些你可以尝试的故障排除步骤:
1、验证cx_Oracle安装:确保你已正确安装了cx_Oracle库。你可以使用以下命令进行安装:pip install cx_Oracle。
2、检查Oracle客户端安装:确保在运行Flask的计算机上安装了Oracle客户端软件。cx_Oracle库需要Oracle客户端来建立连接。确保Oracle客户端版本与你尝试连接的Oracle服务器版本相匹配。
3、验证连接详细信息:仔细检查主机、端口、用户名、密码和数据库等连接详细信息。确保它们是正确的并且格式正确。
4、检查网络连接:确保你的Flask应用程序和Oracle服务器之间存在网络连接。确保没有防火墙限制或网络问题阻止连接。
5、检查Oracle监听器:验证Oracle监听器在服务器上是否正在运行。你可以尝试使用其他工具(如SQL*Plus)连接到Oracle服务器,以确认服务器是否可访问。
6、检查TNS Names配置:如果你使用TNS names文件进行连接配置,请确保它已正确配置并且Flask应用程序可以访问它。
7、异常处理不够具体:在连接失败时,你的代码只是打印了"连接失败",而没有提供更具体的错误信息。为了查找问题,你可以修改异常处理代码,将错误信息打印出来。这样可以帮助你找到导致连接失败的具体原因。你可以将 except 代码块修改为以下形式:
except cx_Oracle.Error as error:
print('连接Oracle失败:', error)
通过按照这些步骤并解决任何潜在问题,你应该能够解决连接错误,并成功地使用cx_Oracle在Flask中与Oracle建立连接。
检查连接参数:确保你提供的连接参数是正确的。比如,确认主机(host)、端口(port)、用户名(user)、密码(password)、数据库(database)和字符集(charset)的值都是正确的。确保这些值与你的实际数据库设置相匹配。
导入 cx_Oracle 模块:确保你已经正确导入了 cx_Oracle 模块。可以在代码开头添加以下导入语句:
import cx_Oracle
检查数据库连接方式:根据你的代码,你使用的是基于 IP 地址和端口号的连接方式。确保你的数据库确实可以通过指定的 IP 地址和端口进行访问。
这个错误通常是因为在连接Oracle时使用了不正确的参数。在Flask中连接Oracle需要使用cx_Oracle
模块,可以按照以下步骤进行操作:
确保已经安装了cx_Oracle
模块,可以使用以下命令进行安装:
pip install cx_Oracle
在Flask应用程序中导入cx_Oracle
模块:
import cx_Oracle
使用以下代码连接Oracle数据库:
conn = cx_Oracle.connect(user='username', password='password', dsn='host:port/service_name')
其中,username
和password
是Oracle数据库的用户名和密码,host
是Oracle数据库的主机名,port
是Oracle数据库的端口号,service_name
是Oracle数据库的服务名。
注意:在使用cx_Oracle
连接Oracle数据库时,需要使用dsn
参数指定连接字符串,而不是使用host
参数。
如果还有问题,请提供更多的代码和错误信息,以便更好地帮助您解决问题。
回答部分参考、引用ChatGpt以便为您提供更准确的答案:
根据您提供的代码和报错信息,您在使用Flask连接Oracle数据库时遇到了连接失败的问题,并且报错信息提示"'host' is an invalid keyword argument for this function"。
根据报错信息分析,问题出现在您使用了cx_Oracle.connect()
函数时传递了一个无效的参数host
。在cx_Oracle
模块中,并没有名为host
的参数。要连接Oracle数据库,您需要使用正确的参数来配置连接。
正确的方式是使用cx_Oracle.makedsn()
函数来创建DSN(Data Source Name),然后将DSN作为参数传递给cx_Oracle.connect()
函数。在您的代码中,您可以将连接配置修改为以下形式:
import cx_Oracle
class Mysql(object):
def __init__(self):
try:
dsn = cx_Oracle.makedsn('11.11.11.111', '1111', service_name='1111111')
self.db = cx_Oracle.connect(user='11', password='11111', dsn=dsn, encoding='GBK')
self.cursor = self.db.cursor()
print('连接成功')
except cx_Oracle.Error 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.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD = b.STCD where r.TM >= sysdate - interval '1' group by r.STCD, b.STNM, b.STLC, b.ADMAUTH order by sum(r.DRP) desc) t where RN < 41"
# 执行语句
self.cursor.execute(sql)
# 获取所有记录
results = self.cursor.fetchall()
print(sql)
print(results)
return results
在修改后的代码中,使用cx_Oracle.makedsn()
函数创建了DSN,然后将DSN作为参数传递给cx_Oracle.connect()
函数。同时,捕获了cx_Oracle.Error
异常,并打印了详细的错误信息。
请注意,如果您的Oracle数据库不是使用服务名(service name)而是使用SID来进行连接,请使用cx_Oracle.makedsn()
函数的sid
参数替代service_name
参数。
希望以上修改可以帮助您成功连接Oracle数据库。
检查连接参数是否正确,确认Oracle服务是否启动,确认数据库实例名是否正确
可以在except代码块中打印异常信息,查看具体的错误信息,例如:
except Exception as e:
print('连接失败:', e)