Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用JPype-如何访问JDBC元数据函数_Python_Jdbc_Jpype_Jaydebeapi - Fatal编程技术网

Python 使用JPype-如何访问JDBC元数据函数

Python 使用JPype-如何访问JDBC元数据函数,python,jdbc,jpype,jaydebeapi,Python,Jdbc,Jpype,Jaydebeapi,我正在使用它来加载FileMaker的JDBC驱动程序并提取数据 但是我也希望能够获得数据库中所有表的列表 在(第55页)中列出了以下功能: JDBC客户端驱动程序支持以下元数据功能: getColumns getColumnPrivileges 获取元数据 getTypeInfo 可获得 可获取类型 你知道我怎么称呼他们吗 如果有帮助,以下是我当前的代码: import jaydebeapi import jpype jar = r'/opt/drivers/fmjdbc.jar' args

我正在使用它来加载FileMaker的JDBC驱动程序并提取数据

但是我也希望能够获得数据库中所有表的列表

在(第55页)中列出了以下功能:

JDBC客户端驱动程序支持以下元数据功能:

getColumns

getColumnPrivileges

获取元数据

getTypeInfo

可获得

可获取类型

你知道我怎么称呼他们吗

如果有帮助,以下是我当前的代码:

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

从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"} );
获取架构中的所有表(仅表)


尊敬。

来自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"} );
获取架构中的所有表(仅表)


问候。

好的,多亏了埃尔塔博和胡安·梅拉多,我才明白了这一点

我只需要传入正确的参数来匹配方法签名

以下是工作代码:

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

好吧,多亏了埃尔塔博和胡安·梅拉多,我才明白了这一点

我只需要传入正确的参数来匹配方法签名

以下是工作代码:

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

我现在不能测试,但是我认为调用应该匹配Java getTables方法签名,那么:
conn.jconn.getMetadata().getTables(None,None,“%”,None)
我现在不能测试,但是我认为调用应该匹配Java getTables方法签名,那么:
conn.jconn.getMetadata().getTables()呢(None,None,“%”,None)
No,不要删除它。这真的很有用。小更正:您将conn设置为您的连接,然后您一直引用souce\u conn。我假设您希望设置source\u conn而不是conn(第9行)。我还有一个问题(可能我使用的是不同版本的jpype或jaydebeapi);我需要如下设置游标的meta属性:
table\u reader\u cursor.\u meta=results.getMetaData()
。如果我不这样做,当它试图调用getColumncount on _meta时,我会得到一个AttributeError。除此之外,你真的帮了我的忙!你可以从self.cursor中的特定请求访问元数据。_meta属性。不,不要删除它。这非常有用。小的更正:你将conn设置为你的连接,然后你引用它r一直都是源代码连接。我假设您希望设置源代码连接而不是连接(第9行)。我还有一个问题(可能我使用的是不同版本的jpype或jaydebeapi);我需要设置游标的meta属性,如下所示:
table\u reader\u cursor.\u meta=results.getMetaData()
。如果我不这样做,当它试图调用getColumncount on _meta时,我会得到一个AttributeError。除此之外,你真的帮了我的忙!你可以从self.cursor中的特定请求访问元数据。_meta属性。