python - 无法将 Python 连接到 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:\app\413022472\product\12.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:\app\413022472\product\12.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\413022472\product\12.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:\app\413022472\product\12.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)
)
)
这是我select instance_name from v$instance;
在sqlplus中运行时得到的:
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 教程中的一个片段(请记住相应地更改用户/密码)。
import cx_Oracle
con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')
print con.version
con.close()
这是官方cx_Oracle 文档的链接。
最后,在这个 GitHub URL 上,您可以找到几个更新的示例,这些示例可能有助于加快您的工作。
推荐阅读
- docker - ASP.NET Core Web API 客户端不信任 Identity Server 实例使用的自签名证书
- ios - 如何使屏幕背景数据快速可见?
- java - 如何将信息从手机 NFC 发送到 RFID-RC522 模块?
- javascript - 如何将 Json 数组加载到单独的表行中?
- selenium - 寻找以下 HTML 代码的替代 xpath
- r - 无法发布闪亮的应用程序
- django-cms - 使用 Django CMS 在网页中添加文本框和组合框
- json - 尝试解析 JSON 时,Spring RestTemplate 响应正文为空
- css - SASS 值变量的使用:最佳实践
- javascript - Internet Explorer 11:打印功能创建空白页