Pergunta

estou a usar JayDeBeAPI que usa JPype para carregar o driver JDBC do FileMaker e extrair dados.

Mas eu também quero poder obter uma lista de todas as tabelas no banco de dados.

No Documentação JDBC (página 55) lista as seguintes funções:

O driver cliente JDBC suporta as seguintes funções de metadados:

getColumns

getColumnPrivileges

getMetaData

getTypeInfo

getTables

getTableTypes

Alguma idéia de como posso chamá-los de JPype ou JayDeBeAPI?

Se ajudar, aqui está meu código atual:

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

Atualizar:

Aqui estão alguns progressos e parece que deveria funcionar, mas estou recebendo o erro abaixo.Alguma ideia?

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

Solução

Ok, graças ao eltabo e ao Juan Mellado eu descobri!

Eu só tive que passar os parâmetros corretos para corresponder à assinatura do método.

Aqui está o código de trabalho:

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

Outras dicas

Do Javadoc do ResultSet:

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

Você precisa passar os quatro parâmetros para o método.Não sou desenvolvedor python, mas em Java eu ​​uso:

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

para obter todas as tabelas (e apenas as tabelas) em um esquema.

Cumprimentos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top