当前位置: 代码迷 >> python >> 无法在 Linux 上使用 python3 和 cx_Oracle 作为外部识别用户进行连接
  详细解决方案

无法在 Linux 上使用 python3 和 cx_Oracle 作为外部识别用户进行连接

热度:115   发布时间:2023-06-27 21:49:34.0

我正在尝试编写一个简单的 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

任何人都可以在这里帮助我,这感觉应该很简单!

谢谢

你正在尝试的对我有用:

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 环境变量设置为该目录。

解决了! 感谢 Bobby 为我指明了正确的方向,问题是通过在连接字符串中指定 DB,它被解释为远程连接,因此由于禁用了远程身份验证而不允许使用。

诀窍是根本不在连接字符串中设置数据库,如下图所示,然后它就像连接到本地数据库的魅力

con = cx_Oracle.Connection('/')

我认为相当于 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,则无法通过网络进行操作系统身份验证。 如果你只是使用 / 你不会通过网络。 更改参数后必须反弹数据库。

鲍比