我想用cx_Oracle将Python连接到本地Oracle。我知道为了建立连接,我应该知道本地IP,端口和SID。所以我通过以下步骤获得这些信息:
本地IP:
%% Mysql DB Config of ChicagoBoss
{db_schema, "your_db_name"}.
{db_username, "boss"}.
{db_password, "boss"}.
{dp_ip, "127.0.0.1"}.
{db_port, 27017 }.
{pool_size, 10}.
端口: 这是来自我的 listener.ora 所以我使用端口1521。
import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())
sid :这让我很烦恼。我尝试了很多,但仍然无法获得正确的sid。这来自我的 tnsnames.ora :
# 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)
这是我在 sqlplus 中运行# 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;
我尝试了以下内容:
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')
我应该告诉我,我在listener.ora和tnsnames.ora中更改了文本,但我无法记住细节。谁能帮助我成功连接?
答案 0 :(得分:1)
我会使用此Oracle tutorial的片段(请记得相应地更改用户/传递)。
import cx_Oracle
con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')
print con.version
con.close()
以下是官方cx_Oracle Documentation的链接。
作为this GitHub URL的最后一件事,您可以找到一些可能有助于加快工作的更新示例。
玩得开心,快乐的黑客!
答案 1 :(得分:1)
在侦听器中,有许多因素会影响创建连接。 以下是我的系统中“listener.ora”文件的内容。 在此之前,通过在命令提示符中使用“hostname”验证您的主机名是否有效。在替换侦听器文件的内容之前,需要获取现有listener.ora文件的副本。一旦修改了listener.ora文件,就会重新启动监听器和Oracle服务。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="right-block--wrapper">
<p>Demo Content</p>
</div><!-- right-block--wrapper -->
答案 2 :(得分:0)
根据我的经验,这可能是一个令人沮丧的调试错误。您可能已经解决了该错误,但是我将在这里添加我的解决方案,以解决那些通过cx_Oracle连接到Oracle遇到类似错误的人。
这里要注意的重要事项:
import platform platform.architecture()
TNS_ADMIN
变量设置为TNS文件所在的位置。import cx_Oracle conn = cx_Oracle.connect('<username>','<password>','<service name variable in your TNS file>')
此方法使用TNS文件中提供的连接详细信息,并且cx_Oracle从文件本身访问主机和端口详细信息。