Comment accéder à Oracle depuis Python?

Comment puis-je accéder à Oracle depuis Python? J'ai téléchargé un installateur MSI cx_Oracle, mais Python ne peut pas importer la bibliothèque.

j'obtiens 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 vous serai reconnaissant de toute aide.

23
demandé sur Gaffi 2010-08-19 16:24:17

7 réponses

Voici ce qui a fonctionné pour moi. Mes versions Python et Oracle sont légèrement différentes des vôtres, mais la même approche devrait s'appliquer. Assurez-vous simplement que la version de l'installateur binaire cx_Oracle corresponde aux versions de votre client Oracle et 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

Mesures:

  1. Téléchargez le paquet client Oracle Instant. J'ai utilisé instantclient-de base-win32-11.2.0.1.0.zip. Décompresse. C:\your\path\to\instantclient_11_2
  2. Téléchargez et lancez l'installateur 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 l'ai pointé vers L'emplacement Python 2.7 qu'il a trouvé dans le registre.
  3. définir L'environnement ORACLE_HOME et PATH les variables via un script batch ou n'importe quel mécanisme qui a du sens dans le contexte de votre application, de sorte qu'elles pointent vers le répertoire client instantané D'Oracle. See oracle_python.chauve-souris de la source ci-dessous. Je suis sûr qu'il y a une solution plus élégante pour cela, mais je voulais limiter mes modifications au système autant que possible. Assurez-vous de placer le répertoire client Oracle Instant ciblé au début du chemin (ou au moins avant tout autre répertoire client Oracle). Maintenant, je ne fais que de la ligne de commande des trucs pour que je dirige oracle_python.bat dans l'interpréteur de commandes avant d'exécuter des programmes qui nécessitent cx_Oracle.
  4. Lancez regedit et vérifiez s'il y a une clé NLS_LANG définie à \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. Si oui, renommer la clé (je l'ai changée en NLS_LANG_OLD) ou la désactiver. Cette clé ne doit être utilisée que comme valeur par défaut NLS_LANG pour Oracle 7 client, il est donc sûr de la supprimer à moins que vous ne vous trouviez à utiliser Oracle 7 client ailleurs. Comme toujours, assurez-vous de sauvegarder votre registre avant de faire des changements.
  5. Maintenant, vous devriez pouvoir importer cx_Oracle dans votre programme Python. Voir la oracle_test.py source ci-dessous. Notez que j'ai dû configurer la connexion et les chaînes SQL à Unicode pour ma version de cx_Oracle.

Source: oracle_python.chauve-souris

@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()

Questions Possibles:

  • "TypeError: argument 1 doit être unicode, pas de str" - si vous devez définir la connexion en chaîne de caractères au format Unicode.
  • "TypeError: expecting None or a string" - si vous avez besoin de définir la chaîne SQL à Unicode.
  • "ImportError: DLL load failed: La procédure spécifiée est introuvable."- peut indiquer que cx_Oracle ne peut pas trouver le client Oracle approprié DLL.
30
répondu Devon Biere 2011-01-24 16:33:17

en plus du client Oracle instant, vous pouvez également avoir besoin d'installer les composants Oracle ODAC et de mettre le chemin vers eux dans votre chemin système. cx_Oracle semble avoir besoin d'accéder au bec.fichier dll qui est installé avec eux.

vérifiez aussi que vous avez la bonne version (32bit ou 64bit) de ceux qui correspondent à vos versions: python, cx_Oracle et client instantané.

3
répondu Mike 2012-03-16 10:48:41

voici à quoi ressemble mon code. Il montre également un exemple de la façon d'utiliser les paramètres de requête en utilisant un dictionnaire. Il fonctionne sur L'utilisation de 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'})
3
répondu Vlad Bezden 2018-03-23 10:44:12

en plus de cx_Oracle, vous devez avoir la bibliothèque client Oracle installée et les chemins définis correctement afin que cx_Oracle le trouve - essayez d'ouvrir la DLL cx_Oracle dans "Dependency Walker" (http://www.dependencywalker.com/) pour voir ce qu'est la DLL manquante.

2
répondu TML 2010-08-19 18:54:57

si vous utilisez virtualenv, il n'est pas aussi trivial d'utiliser l'installateur. Ce que vous pouvez faire ensuite: installer comme décrit par Devon. Puis copier sur cx_Oracle.pyd et la cx_Oracle-XXX.le dossier egg-info de Python\Lib\site-packages dans le Lib\site-paquets de votre env virtuel. Bien sûr, ici aussi, l'architecture et la version sont importantes.

2
répondu Ward 2015-04-02 08:43:49

s'Assurer que ces deux et cela devrait fonctionner:-

  1. Python, Oracle instantclient et cx_Oracle ont 32 bits.
  2. Définir les variables d'environnement.

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

1
répondu Venu Murthy 2013-07-08 01:25:27

Remarque: si vous utilisez les 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
répondu sushmit 2018-08-15 15:02:11