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

时间:2018-09-24 13:38:24

标签: python cx-oracle

我正在尝试编写一个简单的python脚本,它将以外部标识的用户身份连接到我的oracle数据库,然后执行一些操作。但是我无法通过连接。

如果我在连接字符串中对用户/密码进行了硬编码,则它可以正常连接并按预期打印出数据库版本,因此连接字符串的格式必须有效

catch(\Kreait\Firebase\Exception\Messaging\NotFound $e)

现在可以从外部识别os用户,如下所示:

import cx_Oracle
con = cx_Oracle.connect('<user>','<password>','<service name>')
print (con.version)
con.close()

因此,从搜索时看到的内容来看,我应该能够运行以下代码进行连接:

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()

有人可以在这里帮我吗,感觉应该很简单!

谢谢

3 个答案:

答案 0 :(得分: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环境变量设置为该目录。

答案 1 :(得分:1)

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

诀窍是根本不设置连接字符串中的数据库,如下图所示,然后就像连接到本地数据库的超级按钮一样工作

con = cx_Oracle.Connection('/')

答案 2 :(得分:0)

我认为相当于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,则无法通过网络进行OS身份验证。如果仅使用/,则不会通过网络。更改参数后,必须重新启动数据库。

鲍比