Utilisation de JPPYPE - Comment accéder aux fonctions JDBC Meta Data
-
21-12-2019 - |
Question
J'utilise Jaydeapi qui utilise JPYPY pour charger le pilote JDBC de FileMaker et tirer les données.
Mais je veux aussi être capable de Obtenir une liste de toutes tables dans la base de données.
dans le Documentation JDBC (page 55)Il répertorie les fonctions suivantes:
Le pilote client JDBC prend en charge les fonctions de métadonnées suivantes:
getcolumns
getcolumnprivileges
GETMETADATA
gettypeinfo
Gettables
getTableTypes
Des idées Comment je pourrais les appeler de JPYPY ou JAYDEBEAPI?
Si cela aide, voici mon code actuel:
import jaydebeapi
import jpype
jar = r'/opt/drivers/fmjdbc.jar'
args='-Djava.class.path=%s' % jar
jvm_path = jpype.getDefaultJVMPath()
jpype.startJVM(jvm_path, args)
conn = jaydebeapi.connect('com.filemaker.jdbc.Driver',
SETTINGS['SOURCE_URL'], SETTINGS['SOURCE_UID'], SETTINGS['SOURCE_PW'])
curs = conn.cursor()
#Sample Query:
curs.execute("select * from table")
result_rows = curs.fetchall()
mise à jour:
Voici quelques progrès et il semble que cela fonctionne, mais je reçois l'erreur ci-dessous.Des idées?
> conn.jconn.metadata.getTables()
*** RuntimeError: No matching overloads found. at src/native/common/jp_method.cpp:121
La solution
OK, merci à Eltabo et à Juan Mellado, je l'ai compris!
J'ai juste dû passer les paramètres corrects pour correspondre à la signature de la méthode.
Voici le code de travail:
import jaydebeapi
import jpype
jar = r'/opt/drivers/fmjdbc.jar'
args='-Djava.class.path=%s' % jar
jvm_path = jpype.getDefaultJVMPath()
jpype.startJVM(jvm_path, args)
conn = jaydebeapi.connect('com.filemaker.jdbc.Driver',
SETTINGS['SOURCE_URL'], SETTINGS['SOURCE_UID'], SETTINGS['SOURCE_PW'])
results = source_conn.jconn.getMetaData().getTables(None, None, "%", None)
#I'm not sure if this is how to read the result set, but jaydebeapi's cursor object
# has a lot of logic for getting information out of a result set, so let's harness
# that.
table_reader_cursor = source_conn.cursor()
table_reader_cursor._rs = results
read_results = table_reader_cursor.fetchall()
#get just the table names
[row[2] for row in read_results if row[3]=='TABLE']
Autres conseils
de Resulatset Javadoc:
public ResultSet getTables(String catalog,
String schemaPattern,
String tableNamePattern,
String[] types)
throws SQLException
Vous avez besoin de passer le paramètre quatre sur la méthode.Je ne suis pas un développeur python, mais en Java, j'utilise:
ResultSet rs = metadata.getTables(null, "public", "%" ,new String[] {"TABLE"} );
Pour obtenir toutes les tables (et uniquement les tables) dans un schéma.
Cordialement.