Używam jaydebeapi do łączenia się z bazą danych Oracle. Kod wygląda następująco:

host = [address]
port = "1521"
sid = "ctginst1"
database = "oracle"
drivertype = "thin"
uid = [user]
pwd = [pass]

driver_class = "oracle.jdbc.OracleDriver"

driver_file = "ojdbc10.jar"

connection_string="jdbc:{}:{}@{}:{}:{}".format(database, drivertype, host, port, sid)

conn=jaydebeapi.connect(driver_class, connection_string, [uid, pwd], driver_file, )

Jednak to się nie udaje i wyświetla mi błąd:

java.lang.RuntimeException: Class oracle.jdbc.OracleDriver not found

Edycja: przekazując CLASSPATH z lokalizacją .jar podczas uruchamiania maszyny JVM i dopiero wtedy próbując nawiązać połączenie, udało mi się przejść dalej

import jpype
jpype.startJVM(jpype.getDefaultJVMPath(), '-Djava.class.path=%s' % driver_file)

A teraz otrzymuję błąd java.sql.SQLException: Invalid Oracle URL specified

1
gribna 16 grudzień 2019, 15:54
Musisz przekazać ścieżkę do sterownika JDBC jako ostatni parametr do connect. Zobacz pypi.org/project/JayDeBeApi/#usage. Zmienna środowiskowa CLASSPATH nie jest używana w przypadku większości sposobów wykonywania Javy, a JAVA_HOME\lib zdecydowanie do niej nie należy i nie należy umieszczać losowych bibliotek, które nie są częścią samej Javy JAVA_HOME\lib.
 – 
Mark Rotteveel
16 grudzień 2019, 16:00
Nie skopiowałem w całości ostatniej linijki, ścieżka do kierowcy rzeczywiście jest na końcu.
 – 
gribna
16 grudzień 2019, 16:05
Wtedy driver_file powinno być pełną ścieżką do sterownika (lub ewentualnie ścieżką względną do programu w Pythonie), a nie tylko nazwą pliku jar sterownika.
 – 
Mark Rotteveel
16 grudzień 2019, 16:07
Jar istnieje również w folderze głównym programu. Próbowałem również pełnej ścieżki bezwzględnej, takiej jak "C:\ojdbc10.jar".
 – 
gribna
16 grudzień 2019, 16:10
ojdbc10.jar dotyczy Javy 10. Czy masz zainstalowaną Javę 10 lub nowszą? Czy JayDeBeApi działa nawet na Javie 10?
 – 
Mark Rotteveel
16 grudzień 2019, 16:12

1 odpowiedź

Okej, więc stamtąd najwyraźniej brakowało dwukropka przed „@”. Pełny kod pomyślnego połączenia wygląda następująco:

import jaydebeapi
import jpype

host = host
port = "1521"
sid = "ctginst1"
database = "oracle"
drivertype = "thin"
uid = user
pwd = password

driver_class = "oracle.jdbc.OracleDriver"

driver_file = "C:\ojdbc8.jar"

connection_string="jdbc:{}:{}:@{}:{}:{}".format(database, drivertype, host, port, sid)

jpype.startJVM(jpype.getDefaultJVMPath(), '-Djava.class.path=%s' % driver_file)

conn=jaydebeapi.connect(driver_class, connection_string, [uid, pwd])
0
gribna 16 grudzień 2019, 17:07