I want to access databases by Jython by using JDBC drivers. I started with SQLite because this needs no database installation. I found two tutorials that implement similar things in Java and in Python using the same sample database.
I translated the following Java program to Jython:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Sample { public static void main(String[] args) throws ClassNotFoundException { // load the sqlite-JDBC driver using the current class loader Class.forName("org.sqlite.JDBC"); Connection connection = null; try { // create a database connection connection = DriverManager.getConnection("jdbc:sqlite:sample.db"); Statement statement = connection.createStatement(); statement.setQueryTimeout(30); // set timeout to 30 sec. statement.executeUpdate("drop table if exists person"); statement.executeUpdate("create table person (id integer, name string)"); statement.executeUpdate("insert into person values(1, 'leo')"); statement.executeUpdate("insert into person values(2, 'yui')"); ResultSet rs = statement.executeQuery("select * from person"); while(rs.next()) { // read the result set System.out.println("name = " + rs.getString("name")); System.out.println("id = " + rs.getInt("id")); } } catch(SQLException e) { // if the error message is "out of memory", // it probably means no database file is found System.err.println(e.getMessage()); } finally { try { if(connection != null) connection.close(); } catch(SQLException e) { // connection close failed. System.err.println(e); } } } }
Here is my implementation of this Java program in Jython:
# rem set PATH=C:\ProgramData\Oracle\Java\javapath;%PATH%
# set CLASSPATH=C:\sqlite\java\sqlite-jdbc-3.21.0.jar
# C:\jython2.7.0\bin\jython.exe sample.py
import java
from java.sql import SQLException
#load the sqlite-JDBC driver using the current class loader
java.lang.Class.forName("org.sqlite.JDBC")
url = "jdbc:sqlite:C:/sqlite/db/chinook.db"
connection = None
try:
connection = java.sql.DriverManager.getConnection(url)
statement = connection.createStatement()
statement.executeUpdate("drop table if exists person")
statement.executeUpdate("create table person (id integer, name string)");
statement.executeUpdate("insert into person values(1, 'leo')");
statement.executeUpdate("insert into person values(2, 'yui')");
rs = statement.executeQuery("select * from person")
while (rs.next()):
print("name = %s"%(rs.getString("name")))
print("id = %s"%(rs.getString("id")))
except SQLException as e:
# if the error message is "out of memory",
# it probably means no database file is found
print("error: %s"%e.getMessage())
finally:
try:
if(connection is not None):
connection.close()
except SQLException as e:
# connection close failed.
print("error: %s"%e.getMessage())
Is this an appropriate translation from Java to Jython? Can the Jython program be improved?
sqlite
module from Python directly and benefit from the context managers already in place. \$\endgroup\$