cx_Oracle hasst mich

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TalaatHarb
User
Beiträge: 3
Registriert: Mittwoch 22. April 2020, 07:24

Hallo,

ich habe ein kleines Programm in Python geschireben das sich mit einer Datenbank verbinden soll.
Es erhält die Zugangsdaten von einem Shellskript und sollte damit den connect durchführen - tut es aber nicht.

Code: Alles auswählen

#!/bin/python

import cx_Oracle
import os
import subprocess

credentials = subprocess.Popen(['./db.sh'], stdout=subprocess.PIPE)
credentials = credentials.communicate()[0]
credentials = credentials.split(" ")
print "user: " + credentials[0]
print "pass: " + credentials[1]
print "tnsa: " + credentials[2]

connect_string=credentials[0]+"/"+credentials[1]+"@"+credentials[2]
print "conn: " + connect_string
orcl = cx_Oracle.connect(connect_string)
curs = orcl.cursor()


sql="select * from global_name"
curs.execute(sql)
curs.execute('commit')
#orcl.commit()
orcl.close()
Das Shellskript liefert drei durch Leerzeichen getrennte Werte zurück. Der dritte ist ein Alias in meiner tnsnames.ora.

Ich kann das Programm ausführen oder interaktiv die einzelnen Schritte durchführen...an der Stelle des cx_Oracle.connect erhalte ich den Fehler:

Code: Alles auswählen

    orcl = cx_Oracle.connect(connect_string)
cx_Oracle.DatabaseError: ORA-12154: TNS:could not resolve the connect identifier specified
Der connect funktioniert, wenn statt der Variable connect_string der Wert verwendet wird.
Der connect liefert den gleichen Fehler, wenn als Wert 'user/pass@db' verwendet wird.


Biite, was mache ich hier falsch? Mit der dringenden höflichen Bitte um Erhellung.

Vielen Dank im voraus.


Nachtrag: Möglicherweise passt das subforum "Datenbankprogrammierung mit Python" besser. Bitte gegebenenfalls verschieben.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Python2 sollte man nicht mehr benutzen. Bei Python3 kannst Du auch subprocess.run verwenden, was deutlich einfacher ist als Popen.
Benutze keine Abkürzungen, wenn Du eine Datenbankverbindung meinst, schreibe nicht orxl. *-SELECTS vermeiden, immer konkret die Spaltennamen, die man möchte angeben.
Strings stückelt man nicht mit + zusammen, sondern per Formatstring, ab Python3.6 auch f-Strings.
Seit wann liegt Python unter /bin/?

Code: Alles auswählen

#!/usr/bin/env python3
import cx_Oracle
import subprocess

credentials = subprocess.run(['./db.sh'], stdout=subprocess.PIPE).stdout
user, password, tnsa = credentials.split()
print(f"conn: {user}/{password}@{tnsa}")
connection = cx_Oracle.connect(user, password, tnsa, encoding="UTF-8")
cursor = connection.cursor()
cursor.execute("SELECT a,b,c FROM global_name")
Stimmen denn die Verbindungsparameter?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Bist du sicher, dass vor der Zeile `credentials = credentials.split(" ")` in `credentials` ein Wert steht, der nicht mit einem Zeilenumbruch endet? Auch ein zusätzliches Leerzeichen im String kann Ärger machen. Mit `credentials = credentials.split()` würdest du solche Probleme auf jeden Fall beseitigen.

Gib doch mal `mit `print(repr(credentials))` aus um zu sehen, welchen Wert du da tatsächlich hast.
TalaatHarb
User
Beiträge: 3
Registriert: Mittwoch 22. April 2020, 07:24

Hallo,
vielen Dank für die schnellen und hilfreichen Antworten.

1)
python3 scheidet leider aus
"Benutze keine Abkürzungen, wenn Du eine Datenbankverbindung meinst" verstehe ich nicht.

2)
Das credentials.split(" ") benötige ich, um die drei mit Leerzeichen getrennten Werte auszulesen - und genau hier liegt der Hase im Pfeffer:

Mein Shellskript liefert die Werte zurück mit:

Code: Alles auswählen

echo $db_user $db_passwd $tns_alias

und damit endet der dritte Wert auf ein '\n'.
Wie werde ich den zusätzlichen Zeilenumbruch los?


Übergangsweise habe ich im Shellskript "echo -n $db_user $db_passwd $tns_alias" verwendet und damit klappt es....aber ich möchte ja lernen, wie man es richtig in Python macht.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann benutz doch split ohne Argument, das ist genau das Richtige für Dich.

Eine Abkürzung ist orcl, weil da Vokale fehlen. Das ist nicht nur schwer lesbar, sondern auch schwierig zu schreiben.

Warum scheidet Python3 aus? Jedes System unterstützt Python3 seit 10 Jahren.
TalaatHarb
User
Beiträge: 3
Registriert: Mittwoch 22. April 2020, 07:24

Vielen Dank...split() liefert das Gewünschte.
python3 haben meine Admins nicht installiert...

Ich werde meine Beziehung zu cx_Oracle überdenken. :-)
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TalaatHarb: Weis Deine Admins mal daraufhin das Python 2 mittlerweile keinen Support mehr hat. Das ist tot. Da wird es nicht einmal mehr Sicherheitsupdates geben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten