it-swarm.com.de

Wie kann ich von Python aus auf Oracle zugreifen?

Wie kann ich von Python aus auf Oracle zugreifen? Ich habe ein cx_Oracle msi-Installationsprogramm heruntergeladen, aber Python kann die Bibliothek nicht importieren.

Ich erhalte folgende Fehlermeldung:

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.

Ich werde für jede Hilfe dankbar sein.

26
user425194

Hier ist was für mich gearbeitet hat. Meine Python- und Oracle-Versionen unterscheiden sich geringfügig von Ihrer Version, es sollte jedoch derselbe Ansatz gelten. Stellen Sie einfach sicher, dass die Version des binären Installationsprogramms von cx_Oracle mit Ihrem Oracle-Client und der Python-Version übereinstimmt.

Meine Versionen:

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

Schritte:

  1. Laden Sie das Oracle Instant Client-Paket herunter. Ich habe instantclient-basic-win32-11.2.0.1.0.Zip verwendet. Entpacken Sie es in C:\Ihren\Pfad\in\InstantClient_11_2
  2. Laden Sie das binäre Installationsprogramm cx_Oracle herunter und führen Sie es aus. Ich habe cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi verwendet. Ich habe es für alle Benutzer installiert und auf den in der Registrierung gefundenen Python 2.7-Speicherort hingewiesen.
  3. Legen Sie die Umgebungsvariablen Oracle_HOME und PATH über ein Batch-Skript oder einen für Ihren Anwendungskontext sinnvollen Mechanismus fest, sodass sie auf das Oracle Instant Client-Verzeichnis verweisen. Siehe die Oracle_python.bat-Quelle unten. Ich bin sicher, dass es dafür eine elegantere Lösung geben muss, aber ich wollte meine systemweiten Änderungen so weit wie möglich einschränken. Stellen Sie sicher, dass Sie das angezielte Oracle Instant Client-Verzeichnis am Anfang von PATH (oder mindestens vor anderen Oracle-Client-Verzeichnissen) ablegen. Im Moment mache ich nur Befehlszeilen-Sachen, also führe ich einfach Oracle_python.bat in der Shell aus, bevor ich alle Programme ausführt, die cx_Oracle benötigen.
  4. Führen Sie regedit aus und prüfen Sie, ob ein NLS_LANG-Schlüssel unter\HKEY_LOCAL_MACHINE\SOFTWARE\Oracle festgelegt ist. Wenn ja, benennen Sie den Schlüssel um (ich habe ihn in NLS_LANG_OLD geändert) oder setzen Sie ihn zurück. Dieser Schlüssel sollte nur als NLS_LANG-Standardwert für den Oracle 7-Client verwendet werden. Sie können ihn also sicher entfernen, es sei denn, Sie verwenden einen Oracle 7-Client an einem anderen Ort. Stellen Sie sicher, dass Sie Ihre Registrierung sichern, bevor Sie Änderungen vornehmen.
  5. Jetzt sollten Sie in der Lage sein, cx_Oracle in Ihr Python-Programm zu importieren. Siehe die Oracle_test.py-Quelle unten. Beachten Sie, dass ich die Verbindungs- und SQL-Zeichenfolgen für meine Version von cx_Oracle auf Unicode setzen musste.

Quelle: Oracle_python.bat

@echo off
set Oracle_HOME=C:\your\path\to\instantclient_11_2
set PATH=%Oracle_HOME%;%PATH%

Quelle: Oracle_test.py

import cx_Oracle

conn_str = u'user/[email protected]: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()

Mögliche Probleme:

  • "ORA-12705: Zugriff auf NLS-Datendateien oder ungültige Umgebung nicht möglich" - Ich bin darauf gestoßen, bevor ich die NLS_LANG-Registrierungsänderung vorgenommen habe.
  • "TypeError: Argument 1 muss Unicode sein, nicht Str." - wenn Sie die Verbindungszeichenfolge auf Unicode setzen müssen.
  • "TypeError: Erwartet keine oder eine Zeichenfolge" - wenn Sie die SQL-Zeichenfolge auf Unicode setzen müssen.
  • "ImportError: DLL Laden fehlgeschlagen: Die angegebene Prozedur wurde nicht gefunden." - Gibt möglicherweise an, dass cx_Oracle die entsprechende Oracle-Client-DLL nicht finden kann.
31
Devon Biere

So sieht mein Code aus. Es zeigt außerdem ein Beispiel für die Verwendung von Abfrageparametern mithilfe eines Wörterbuchs. Es funktioniert mit 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

Neben dem Oracle-Instant-Client müssen Sie möglicherweise auch die Oracle-ODAC-Komponenten installieren und den Pfad zu Ihrem Systempfad angeben. cx_Oracle scheint Zugriff auf die mit ihr installierte Datei oci.dll zu benötigen.

Stellen Sie außerdem sicher, dass Sie die richtige Version (32-Bit oder 64-Bit) von ihnen erhalten, die Ihrer: Python-, cx_Oracle- und Instant-Client-Version entspricht.

3
Mike

Stellen Sie sicher, dass diese beiden funktionieren und es funktionieren sollte: - 

  1. Python, Oracle Instantclient und cx_Oracle sind 32 Bit.
  2. Legen Sie die Umgebungsvariablen fest.

Behebt dieses Problem unter Windows wie ein Zauber.

2
Venu Murthy

Sie können eine der folgenden Methoden auf der Grundlage von Service Name oder SID verwenden, was immer Sie auch haben.

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

ODER

Mit Dienstname:

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

Zusätzlich zu cx_Oracle müssen Sie die Oracle-Clientbibliothek installiert und die Pfade richtig eingestellt haben, damit cx_Oracle es finden kann. Öffnen Sie cx_Oracle DLL in "Dependency Walker" ( http: // www. dependencywalker.com/ ) um zu sehen, was die fehlende DLL ist.

2
TML

Wenn Sie virtualenv verwenden, ist es nicht so einfach, den Treiber über das Installationsprogramm zu erhalten. Was Sie dann tun können: Installieren Sie es wie von Devon beschrieben. Kopieren Sie dann über cx_Oracle.pyd und den Ordner cx_Oracle-XXX.Egg-info aus Python\Lib\site-packages In die Lib\site-packages Ihrer virtuellen Umgebung. Natürlich sind auch hier Architektur und Version wichtig.

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

Hinweis : 

  1. Platzieren Sie in (dsn_tns) bei Bedarf ein 'r' vor einem Parameter, um Sonderzeichen wie '\' zu adressieren.

  2. Platzieren Sie in (conn) bei Bedarf ein 'r' vor einem Parameter, um Sonderzeichen wie '\' zu adressieren. Wenn Ihr Benutzername beispielsweise '\' enthält, müssen Sie vor dem Benutzernamen 'r' eingeben: user = r'User Name 'oder password = r'password'

  3. verwenden Sie dreifache Anführungszeichen, wenn Sie Ihre Abfrage auf mehrere Zeilen verteilen möchten.

1
Siraj

Beachten Sie, wenn Sie Pandas verwenden, können Sie auf folgende Weise darauf zugreifen:

import pandas as pd
import cx_Oracle
conn= cx_Oracle.connect('username/[email protected]:port/service_name')
try:
    query = '''
         SELECT * from dual
             '''
    df = pd.read_sql(con = conn, sql = query)
finally:
    conn.close()
df.head()
0
sushmit