Pregunta

Estoy usando jaydebeapi que usa jpype para cargar el controlador JDBC de FileMaker y tirar de los datos.

Pero también quiero poder ser capaz de obtener una lista de todas las tablas en la base de datos.

en la Documentación JDBC (página 55)Enumera las siguientes funciones:

El controlador cliente JDBC admite las siguientes funciones de meta Data:

getcolumns

getColumnPrivileges

getMetadata

gettypeinfo

gettables

gettabletypes

¿Alguna idea de cómo podría llamarlos de JPYPE o JAYDEBEAPI?

Si ayuda, aquí está mi código actual:

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

Actualización:

Aquí hay algunos progresos y parece que debería funcionar, pero estoy obteniendo el error a continuación.¿Alguna idea?

> conn.jconn.metadata.getTables()
*** RuntimeError: No matching overloads found. at src/native/common/jp_method.cpp:121

¿Fue útil?

Solución

OK, gracias a Eltabo y Juan Mellado lo descubrí!

Solo tuve que pasar en los parámetros correctos para que coincidan con la firma del método.

Aquí está el código de trabajo:

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']

Otros consejos

del resultado Javadoc:

public ResultSet getTables(String catalog,
                       String schemaPattern,
                       String tableNamePattern,
                       String[] types)
                throws SQLException

Necesitas pasar el cuatro parámetro al método.No soy un desarrollador de Python, sino en Java Yo uso:

ResultSet rs = metadata.getTables(null, "public", "%" ,new String[] {"TABLE"} );

para obtener todas las tablas (y solo las tablas) en un esquema.

Saludos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top