Comment puis-je accéder à Oracle à partir de Python? J'ai téléchargé un programme d'installation msi de cx_Oracle, mais Python ne peut pas importer la bibliothèque.
Je reçois l'erreur suivante:
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.
Je serai reconnaissant pour toute aide.
Voici ce qui a fonctionné pour moi. Mes versions Python et Oracle diffèrent légèrement des vôtres, mais la même approche devrait s'appliquer. Assurez-vous simplement que la version du programme d’installation binaire cx_Oracle correspond à votre client Oracle et aux versions de Python.
Mes versions:
Pas:
Source: Oracle_python.bat
@echo off
set Oracle_HOME=C:\your\path\to\instantclient_11_2
set PATH=%Oracle_HOME%;%PATH%
Source: 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()
Problèmes possibles:
Voici à quoi ressemble mon code. Il montre également un exemple d'utilisation des paramètres de requête à l'aide d'un dictionnaire. Cela fonctionne avec 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'})
En plus du client instantané Oracle, vous devrez peut-être également installer les composants Oracle ODAC et en insérer le chemin dans votre chemin système. cx_Oracle semble avoir besoin d'accéder au fichier oci.dll qui est installé avec eux.
Vérifiez également que vous obtenez la version correcte (32 bits ou 64 bits) qui correspond à vos versions client: python, cx_Oracle et instantanée.
Assurer ces deux et cela devrait fonctionner: -
Résout ce problème sur Windows comme un charme.
Vous pouvez utiliser l’une des méthodes suivantes en vous basant sur Service Name
ou SID
quel que soit votre choix.
Avec 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()
OU
Avec nom de service:
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()
Outre cx_Oracle, vous devez installer la bibliothèque client Oracle et définir correctement les chemins d'accès pour que cx_Oracle puisse le trouver. Essayez d'ouvrir cx_Oracle DLL dans "Dependency Walker" ( http: // www. dependencywalker.com/ ) pour voir quel est le DLL manquant.
Si vous utilisez virtualenv, il n'est pas aussi simple d'obtenir le pilote à l'aide du programme d'installation. Que pouvez-vous faire alors: installez-le comme décrit par Devon. Ensuite, copiez cx_Oracle.pyd et le dossier cx_Oracle-XXX.Egg-info de Python\Lib\site-packages Dans les lib_site-packages de votre env virtuel. Bien entendu, ici aussi, l'architecture et la version sont importantes.
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()
Remarque :
Dans (dsn_tns) si nécessaire, placez un 'r' avant tout paramètre afin d'adresser tout caractère spécial tel que '\'.
Dans (conn) si nécessaire, placez un 'r' avant tout paramètre afin d'adresser tout caractère spécial tel que '\'. Par exemple, si votre nom d'utilisateur contient '\', vous devrez placer 'r' avant le nom d'utilisateur: user = r'User Name 'ou password = r'password'
utilisez des guillemets triples si vous souhaitez répartir votre requête sur plusieurs lignes.
Notez que si vous utilisez des pandas, vous pouvez y accéder de la manière suivante:
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()