问题描述
我正在尝试编写一个简单的 python 脚本,它将作为外部识别的用户连接到我的 oracle 数据库,然后做一些事情。 但是我无法通过连接。
如果我在连接字符串中对用户/密码进行硬编码,那么它就可以正常连接并按预期打印出数据库版本,因此连接字符串的格式必须有效
import cx_Oracle
con = cx_Oracle.connect('<user>','<password>','<service name>')
print (con.version)
con.close()
现在 os 用户被外部识别,如下所示:
sqlplus /
SQL*Plus: Release 11.2.0.4.0 Production on Mon Sep 24 14:28:01 2018
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage
Management, OLAP,
Data Mining and Real Application Testing options
SQL>
因此,根据我在搜索时所看到的,我应该能够运行此代码进行连接:
import cx_Oracle
con = cx_Oracle.connect('','','<service name>')
print (con.version)
con.close()
但这给了我错误:
Traceback (most recent call last):
File "test.py", line 5, in <module>
con = cx_Oracle.connect('','','<service name>')
cx_Oracle.DatabaseError: ORA-01017: invalid username/password; logon denied
任何人都可以在这里帮助我,这感觉应该很简单!
谢谢
1楼
你正在尝试的对我有用:
import cx_Oracle
connection = cx_Oracle.Connection('', '', 'my183')
cur = connection.cursor()
sql = "select user from dual"
for i in cur.execute(sql):
print(i)
产生:
$ python t.py
('CJ',)
在本例中,我有一个 sqlnet.ora,其中包含以下内容(您需要查看设置并使用适合您的版本和环境的设置):
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /Users/cjones/test)
)
)
SQLNET.WALLET_OVERRIDE = TRUE
和一个 tnsnames.ora 与:
my183 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclpdb)
)
)
我的 cwallet.sso 是为“my183”(用户 CJ)创建的,与 tnsnames.ora 和 sqlnet.ora 位于同一目录中。 我的 TNS_ADMIN 环境变量设置为该目录。
2楼
解决了! 感谢 Bobby 为我指明了正确的方向,问题是通过在连接字符串中指定 DB,它被解释为远程连接,因此由于禁用了远程身份验证而不允许使用。
诀窍是根本不在连接字符串中设置数据库,如下图所示,然后它就像连接到本地数据库的魅力
con = cx_Oracle.Connection('/')
3楼
我认为相当于 sqlplus / 的 cx_oracle 是这样的:
con = cx_Oracle.connect('/')
如果你想通过像 ORCL 这样的 tnsname 连接,你需要设置这个参数:
alter system set remote_os_authent=TRUE scope=spfile;
然后您的连接字符串将起作用。 对我来说是:
con = cx_Oracle.connect('','','ORCL')
在 sqlplus 中,相当于
sqlplus /@ORCL
如果不设置 remote_os_authent=TRUE,则无法通过网络进行操作系统身份验证。 如果你只是使用 / 你不会通过网络。 更改参数后必须反弹数据库。
鲍比