web-dev-qa-db-fra.com

Comment puis-je accéder à Oracle à partir de Python?

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.

26
user425194

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:

  • Python 2.7
  • Oracle Instant Client 11G R2
  • cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
  • Windows XP SP3

Pas:

  1. Téléchargez le package Oracle Instant Client. J'ai utilisé instantclient-basic-win32-11.2.0.1.0.Zip. Décompressez le dans C:\votre\chemin\vers\instantclient_11_2
  2. Téléchargez et exécutez le programme d'installation binaire cx_Oracle. J'ai utilisé cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Je l'ai installé pour tous les utilisateurs et pointé vers l'emplacement Python 2.7 trouvé dans le registre.
  3. Définissez les variables d'environnement Oracle_HOME et PATH via un script de traitement par lots ou tout autre mécanisme pertinent dans le contexte de votre application, afin qu'elles pointent vers le répertoire Oracle Instant Client. Voir source Oracle_python.bat ci-dessous. Je suis sûr qu'il doit y avoir une solution plus élégante pour cela, mais je voulais limiter autant que possible les modifications apportées à l'ensemble du système. Assurez-vous de placer le répertoire Oracle Instant Client ciblé au début du PATH (ou au moins devant tous les autres répertoires client Oracle). Pour le moment, je ne fais que des commandes en ligne de commande, je lance donc Oracle_python.bat dans le shell avant d'exécuter les programmes nécessitant cx_Oracle.
  4. Exécutez regedit et vérifiez s'il existe une clé NLS_LANG définie dans\HKEY_LOCAL_MACHINE\SOFTWARE\Oracle. Si c'est le cas, renommez la clé (je l'ai changée en NLS_LANG_OLD) ou supprimez-la. Cette clé ne doit être utilisée que comme valeur par défaut NLS_LANG pour le client Oracle 7; vous pouvez donc la supprimer en toute sécurité, sauf si vous utilisez le client Oracle 7 ailleurs. Comme toujours, veillez à sauvegarder votre base de registre avant d’apporter des modifications.
  5. Vous devriez maintenant pouvoir importer cx_Oracle dans votre programme Python. Voir la source Oracle_test.py ci-dessous. Notez que je devais définir la connexion et les chaînes SQL sur Unicode pour ma version de cx_Oracle.

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:

  • "ORA-12705: Impossible d’accéder aux fichiers de données NLS ou à un environnement non valide spécifié" - j’ai rencontré ce problème avant de modifier le registre NLS_LANG.
  • "TypeError: l'argument 1 doit être unicode, pas str", si vous devez définir la chaîne de connexion sur Unicode.
  • "TypeError: attend aucun ou une chaîne" - si vous devez définir la chaîne SQL sur Unicode.
  • "ImportError: DLL échec du chargement: la procédure spécifiée est introuvable." - peut indiquer que cx_Oracle ne trouve pas la DLL client Oracle appropriée.
31
Devon Biere

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'})
4
Vlad Bezden

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.

3
Mike

Assurer ces deux et cela devrait fonctionner: - 

  1. Python, Oracle instantclient et cx_Oracle sont en 32 bits.
  2. Définissez les variables d'environnement.

Résout ce problème sur Windows comme un charme.

2
Venu Murthy

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()
2
Sahil Chhabra

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.

2
TML

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.

2
Ward
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 : 

  1. Dans (dsn_tns) si nécessaire, placez un 'r' avant tout paramètre afin d'adresser tout caractère spécial tel que '\'.

  2. 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'

  3. utilisez des guillemets triples si vous souhaitez répartir votre requête sur plusieurs lignes.

1
Siraj

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()
0
sushmit