Использование JPYPE - как я могу получить доступ к функциям JDBC Meta Data

StackOverflow https://stackoverflow.com//questions/21027904

  •  21-12-2019
  •  | 
  •  

Вопрос

Я использую jaydebeapi , который использует JPYPE для загрузки драйвера JDBC FileMaker и вытягивает данные.

Но я также хочу иметь возможность получить список всех таблиц в базе данных.

в Документация JDBC (стр. 55)Он перечисляет следующие функции:

Драйверный драйвер JDBC поддерживает следующие функции метаданных:

GetColumns

GetColumnPrivileges

getmetadata

gettypeinfo

GetTables

getTabletypes

Есть идеи, как я могу позвонить им из jpype или jaydebeapi?

Если это поможет, вот мой текущий код:

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

Обновление:

Вот некоторые прогресс, и кажется, что он должен работать, но я получаю ошибку ниже.Любые идеи?

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

Это было полезно?

Решение

Хорошо, благодаря Eltabo и Juan Mellado я понял его!

Мне просто пришлось пройти в правильных параметрах, чтобы соответствовать подписанию метода.

Вот рабочий код:

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

Другие советы

от результатов javadoc:

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

Вам нужно пройти четыре параметра методу.Я не разработчик Python, но в Java я использую:

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

Чтобы получить все таблицы (и только таблицы) в схеме.

С уважением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top