如何从Python访问Oracle?我已经下载了一个cx_Oracle msi安装程序,但Python无法导入该库。
我收到以下错误:
import cx_Oracle
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
import cx_Oracle
ImportError: DLL load failed: The specified module could not be found.
我将不胜感激任何帮助。
答案 0 :(得分:31)
这对我有用。我的Python和Oracle版本与您的版本略有不同,但应采用相同的方法。只需确保cx_Oracle二进制安装程序版本与您的Oracle客户端和Python版本匹配。
我的版本:
<强>步骤:强>
来源:oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
来源:oracle_test.py
import cx_Oracle
conn_str = u'user/password@host:port/service'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select your_col_1, your_col_2 from your_table')
for row in c:
print row[0], "-", row[1]
conn.close()
可能出现的问题:
答案 1 :(得分:5)
以下是我的代码的样子。它还显示了如何使用字典使用查询参数的示例。它适用于使用Python 3.6:
import cx_Oracle
CONN_INFO = {
'host': 'xxx.xx.xxx.x',
'port': 12345,
'user': 'SOME_SCHEMA',
'psw': 'SECRETE',
'service': 'service.server.com'
}
CONN_STR = '{user}/{psw}@{host}:{port}/{service}'.format(**CONN_INFO)
QUERY = '''
SELECT
*
FROM
USER
WHERE
NAME = :name
'''
class DB:
def __init__(self):
self.conn = cx_Oracle.connect(CONN_STR)
def query(self, query, params=None):
cursor = self.conn.cursor()
result = cursor.execute(query, params).fetchall()
cursor.close()
return result
db = DB()
result = db.query(QUERY, {'name': 'happy'})
答案 2 :(得分:3)
除了Oracle即时客户端之外,您可能还需要安装Oracle ODAC组件并将它们的路径放入系统路径中。 cx_Oracle似乎需要访问随它们安装的oci.dll文件。
同时检查您是否获得了与您的:python,cx_Oracle和即时客户端版本匹配的正确版本(32位或64位)。
答案 3 :(得分:2)
除了cx_Oracle之外,您还需要安装Oracle客户端库并正确设置路径以便cx_Oracle找到它 - 尝试在“Dependency Walker”(http://www.dependencywalker.com/)中打开cx_Oracle DLL以查看丢失的DLL是。
答案 4 :(得分:2)
确保这两个,它应该工作: -
在Windows上修复此问题,就像魅力一样。
答案 5 :(得分:2)
如果您使用的是virtualenv,那么使用安装程序获取驱动程序并不是一件容易的事。你可以做什么:按照Devon的描述安装它。然后从Python \ Lib \ site-packages复制cx_Oracle.pyd和cx_Oracle-XXX.egg-info文件夹 从您的虚拟环境进入Lib \ site-packages。当然,在这里,架构和版本也很重要。
答案 6 :(得分:2)
您可以基于Service Name
或SID
使用以下任何一种方式。
具有SID:
import cx_Oracle
dsn_tns = cx_Oracle.makedsn('server', 'port', 'sid')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)
c = conn.cursor()
c.execute('select count(*) from TABLE_NAME')
for row in c:
print(row)
conn.close()
OR
具有服务名称:
import cx_Oracle
dsn_tns = cx_Oracle.makedsn('server', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)
c = conn.cursor()
c.execute('select count(*) from TABLE_NAME')
for row in c:
print(row)
conn.close()
答案 7 :(得分:1)
请注意,如果您使用的是熊猫,则可以通过以下方式进行访问:
import pandas as pd
import cx_Oracle
conn= cx_Oracle.connect('username/pwd@host:port/service_name')
try:
query = '''
SELECT * from dual
'''
df = pd.read_sql(con = conn, sql = query)
finally:
conn.close()
df.head()
答案 8 :(得分:1)
import cx_Oracle
dsn_tns = cx_Oracle.makedsn('host', 'port', service_name='give service name')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)
c = conn.cursor()
c.execute('select count(*) from schema.table_name')
for row in c:
print row
conn.close()
注意:
如果需要,请在(dsn_tns)的(dsn_tns)中放置一个“ r”,以解决诸如“ \”之类的任何特殊字符。
如果需要,在(conn)中,在任何参数之前放置一个“ r”,以解决诸如“ \”之类的任何特殊字符。例如,如果您的用户名包含“ \”,则需要在用户名之前放置“ r”:user = r'User Name'或password = r'password'
如果要跨多行查询,请使用三引号。