我正在使用JayDeBeAPI,它使用JPype加载FileMaker的JDBC驱动程序并提取数据。
但我也希望能够在数据库中获取所有表的列表。
在JDBC documentation(第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
答案 0 :(得分:2)
好的,感谢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']
答案 1 :(得分:1)
来自ResultSet 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"} );
获取模式中的所有表(以及仅表)。
问候。