2

Jython2.2.1とMySQLConnector/J5.1を使用してMySQLデータベースにアクセスしています。zxJDBCのcursor.tables()メソッドを使用して、そのデータベース内のテーブルのリストを取得したいと思います。ただし、このメソッドは常にNoneを返します。

zxJDBCのドキュメントによると、cursor.tables()はJavaのDatabaseMetaData.getTables()と同じです。このJavaメソッドをJythonから呼び出すと、期待どおりに機能しますが、zxJDBCパッケージを使用しても機能しません。これが私が試したことです:

import java.sql.*;

public class TableTest {
    public static void tables(String url) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, "root", null);
            DatabaseMetaData meta = conn.getMetaData();
            ResultSet rs = meta.getTables(null, null, "%",
                                          new String[] {"TABLE"});
            while (rs.next()) {
                System.out.println(rs.getString("TABLE_NAME"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Jythonからこれを呼び出すと、すべて問題ありません。

from com.ziclix.python.sql import zxJDBC
import TableTest

url = 'jdbc:mysql://localhost/jythontest'

print 'Java:'
TableTest.tables(url);

print 'Python:'
conn = zxJDBC.connect(url, 'root', None, 'com.mysql.jdbc.Driver')
cursor = conn.cursor()
print cursor.tables(None, None, '%', ('TABLE',))

テストデータベースには、「table_a」と「table_b」という2つのテーブルがあります。出力は次のとおりです。

Java:
table_a
table_b
Python:
None

LinuxとMacOSでこれを試しましたが、同じ結果になりました。zxJDBCの何が問題になっているのかを理解する前に、このパッケージの使用方法に問題があるかどうかを知りたいと思いました。

ありがとうございました。

4

1 に答える 1

2

cursor.tables()の後にprint cursor.fetchall()を試してください

from com.ziclix.python.sql import zxJDBC
import TableTest

url = 'jdbc:mysql://localhost/jythontest'

print 'Java:'
TableTest.tables(url);

print 'Python:'
conn = zxJDBC.connect(url, 'root', None, 'com.mysql.jdbc.Driver')
cursor = conn.cursor()
print cursor.tables(None, None, '%', ('TABLE',))
print cursor.fetchall()

(Informix および jython 2.5 ベータ版でテスト済み)

私が想定し:

  • cursor.tables() は、Python でクエリを実行します
  • cursor.fetchall() は結果を返します
于 2009-02-02T10:28:59.967 に答える