Seite 1 von 1

cx_Oracle hasst mich

Verfasst: Mittwoch 22. April 2020, 07:37
von TalaatHarb
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.

Re: cx_Oracle hasst mich

Verfasst: Mittwoch 22. April 2020, 08:21
von Sirius3
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?

Re: cx_Oracle hasst mich

Verfasst: Mittwoch 22. April 2020, 09:17
von /me
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.

Re: cx_Oracle hasst mich

Verfasst: Mittwoch 22. April 2020, 10:17
von TalaatHarb
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.

Re: cx_Oracle hasst mich

Verfasst: Mittwoch 22. April 2020, 10:58
von Sirius3
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.

Re: cx_Oracle hasst mich

Verfasst: Mittwoch 22. April 2020, 11:25
von TalaatHarb
Vielen Dank...split() liefert das Gewünschte.
python3 haben meine Admins nicht installiert...

Ich werde meine Beziehung zu cx_Oracle überdenken. :-)

Re: cx_Oracle hasst mich

Verfasst: Mittwoch 22. April 2020, 11:35
von __blackjack__
@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.