无法将 Python 连接到 Oracle
Unable to connect Python to Oracle
我想使用 cx_Oracle 将 Python 连接到本地 Oracle。我知道为了建立连接,我应该知道本地 IP、端口和 SID。所以我通过以下步骤得到这些信息:
本地IP:
import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())
端口:
这是来自我的 listener.ora 所以我使用端口 1521.
# listener.ora Network Configuration File: C:\app3022472\product.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app3022472\product.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app3022472\product.2.0\dbhome_1\bin\oraclr12.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
DEFAULT_SERVICE_LISTENER = (orcl)
sid:这让我很困扰。我尝试了很多但仍然无法获得正确的 sid。这是来自我的 tnsnames.ora:
# tnsnames.ora Network Configuration File: C:\app3022472\product.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
这是我在 sqlplus 中 运行 select instance_name from v$instance;
时得到的:
INSTANCE_NAME
--------------------------------
orcl
我尝试了以下方法:
import cx_Oracle
import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())
#generate dsn:
dsn = cx_Oracle.makedsn(localhost, '1521', service_name = 'orcl')
#make connection:
conn = cx_Oracle.connect("c##scott", "tiger", dsn)
这给了我:DatabaseError:ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
我也试过了dsn = cx_Oracle.makedsn(localhost, '1521', sid = 'orcl')
这给了我:ORA-12505: TNS:listener does not currently know of SID given in connect descriptorD
我应该说我更改了 listener.ora 和 tnsnames.ora 中的文本,但我不记得细节了。谁能帮我连接成功?
我会使用此 Oracle tutorial 中的一个片段(记得相应地更改 user/pass)。
import cx_Oracle
con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')
print con.version
con.close()
这里是给官方cx_Oracle Documentation的link。
最后,在 this GitHub URL 您可以找到几个更新的示例,它们可能有助于加快您的工作。
在侦听器中,有很多因素会影响建立连接。
根据我的系统,以下是 "listener.ora" 文件的内容。
在此之前,通过在命令提示符中使用 "hostname" 验证您的主机名是否有效。在替换监听器文件的内容之前,需要一份现有 listener.ora 文件的副本。修改 listener.ora 文件后,还会重新启动侦听器和 Oracle 服务。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app3022472\product.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app3022472\product.2.0\dbhome_1\bin\oraclr12.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = orcl.com)
(ORACLE_HOME =C:\app3022472\product.2.0\dbhome_1)
(SID_NAME = orcl)
)
)
DEFAULT_SERVICE_LISTENER = (orcl)
根据我的经验,这可能是一个非常令人沮丧的调试错误。您可能解决了该错误,但我会在此处添加我的解决方案,以帮助遇到类似错误并通过 cx_Oracle.
连接到 Oracle 的任何人
这里要注意的要点:
- 虽然是数据库错误,但是杀掉重启数据库监听服务是解决不了的,是和我们通过cx_连接做的
- 确保 Oracle 客户端和 Python 具有相同的体系结构,要么都是 32 位,要么都是 64 位。以下是检查 Python 架构的方法:
import platform platform.architecture()
- 确保环境路径变量包含Oracle客户端到bin文件夹的完整路径。
- 确保将
TNS_ADMIN
变量设置为 TNS 文件所在的位置。
- 连接:
import cx_Oracle conn = cx_Oracle.connect('<username>','<password>','<service name variable in your TNS file>')
此方法使用 TNS 文件中提供的连接详细信息,并且 cx_Oracle 从文件本身访问主机和端口详细信息。
我想使用 cx_Oracle 将 Python 连接到本地 Oracle。我知道为了建立连接,我应该知道本地 IP、端口和 SID。所以我通过以下步骤得到这些信息:
本地IP:
import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())
端口: 这是来自我的 listener.ora 所以我使用端口 1521.
# listener.ora Network Configuration File: C:\app3022472\product.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app3022472\product.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app3022472\product.2.0\dbhome_1\bin\oraclr12.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
DEFAULT_SERVICE_LISTENER = (orcl)
sid:这让我很困扰。我尝试了很多但仍然无法获得正确的 sid。这是来自我的 tnsnames.ora:
# tnsnames.ora Network Configuration File: C:\app3022472\product.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
这是我在 sqlplus 中 运行 select instance_name from v$instance;
时得到的:
INSTANCE_NAME
--------------------------------
orcl
我尝试了以下方法:
import cx_Oracle
import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())
#generate dsn:
dsn = cx_Oracle.makedsn(localhost, '1521', service_name = 'orcl')
#make connection:
conn = cx_Oracle.connect("c##scott", "tiger", dsn)
这给了我:DatabaseError:ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
我也试过了dsn = cx_Oracle.makedsn(localhost, '1521', sid = 'orcl')
这给了我:ORA-12505: TNS:listener does not currently know of SID given in connect descriptorD
我应该说我更改了 listener.ora 和 tnsnames.ora 中的文本,但我不记得细节了。谁能帮我连接成功?
我会使用此 Oracle tutorial 中的一个片段(记得相应地更改 user/pass)。
import cx_Oracle
con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')
print con.version
con.close()
这里是给官方cx_Oracle Documentation的link。
最后,在 this GitHub URL 您可以找到几个更新的示例,它们可能有助于加快您的工作。
在侦听器中,有很多因素会影响建立连接。 根据我的系统,以下是 "listener.ora" 文件的内容。 在此之前,通过在命令提示符中使用 "hostname" 验证您的主机名是否有效。在替换监听器文件的内容之前,需要一份现有 listener.ora 文件的副本。修改 listener.ora 文件后,还会重新启动侦听器和 Oracle 服务。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app3022472\product.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app3022472\product.2.0\dbhome_1\bin\oraclr12.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = orcl.com)
(ORACLE_HOME =C:\app3022472\product.2.0\dbhome_1)
(SID_NAME = orcl)
)
)
DEFAULT_SERVICE_LISTENER = (orcl)
根据我的经验,这可能是一个非常令人沮丧的调试错误。您可能解决了该错误,但我会在此处添加我的解决方案,以帮助遇到类似错误并通过 cx_Oracle.
连接到 Oracle 的任何人这里要注意的要点:
- 虽然是数据库错误,但是杀掉重启数据库监听服务是解决不了的,是和我们通过cx_连接做的
- 确保 Oracle 客户端和 Python 具有相同的体系结构,要么都是 32 位,要么都是 64 位。以下是检查 Python 架构的方法:
import platform platform.architecture()
- 确保环境路径变量包含Oracle客户端到bin文件夹的完整路径。
- 确保将
TNS_ADMIN
变量设置为 TNS 文件所在的位置。 - 连接:
import cx_Oracle conn = cx_Oracle.connect('<username>','<password>','<service name variable in your TNS file>')
此方法使用 TNS 文件中提供的连接详细信息,并且 cx_Oracle 从文件本身访问主机和端口详细信息。