diff --git a/README.rst b/README.rst index 448175c..d67818e 100644 --- a/README.rst +++ b/README.rst @@ -158,6 +158,8 @@ Changelog - Improve robustness of java to python type conversion. + - Support Time type. + - Add DB-API compliant exception handling. - Minor documentation improvements. diff --git a/src/jaydebeapi/dbapi2.py b/src/jaydebeapi/dbapi2.py index 0c55bab..4e64d6d 100644 --- a/src/jaydebeapi/dbapi2.py +++ b/src/jaydebeapi/dbapi2.py @@ -526,6 +526,12 @@ def _to_datetime(rs, col): d = d.replace(microsecond=int(str(java_val.getNanos())[:6])) return str(d) +def _to_time(rs, col): + java_val = rs.getTime(col) + if not java_val: + return + return str(java_val) + def _to_date(rs, col): java_val = rs.getDate(col) if not java_val: @@ -579,6 +585,7 @@ _DEFAULT_CONVERTERS = { # http://download.oracle.com/javase/6/docs/api/java/sql/Types.html # for possible keys 'TIMESTAMP': _to_datetime, + 'TIME': _to_time, 'DATE': _to_date, 'BINARY': _to_binary, 'DECIMAL': _to_double, diff --git a/test/data/create.sql b/test/data/create.sql index e47ca90..e249612 100644 --- a/test/data/create.sql +++ b/test/data/create.sql @@ -5,6 +5,7 @@ create table Account ( "BLOCKING" DECIMAL, "DBL_COL" DOUBLE, "OPENED_AT" DATE, +"OPENED_AT_TIME" TIME, "VALID" BOOLEAN, "PRODUCT_NAME" VARCHAR(50), "STUFF" BLOB, diff --git a/test/data/create_hsqldb.sql b/test/data/create_hsqldb.sql index 92cd376..4d49837 100644 --- a/test/data/create_hsqldb.sql +++ b/test/data/create_hsqldb.sql @@ -5,6 +5,7 @@ create table Account ( "BLOCKING" DECIMAL, "DBL_COL" DOUBLE, "OPENED_AT" DATE, +"OPENED_AT_TIME" TIME, "VALID" BOOLEAN, "PRODUCT_NAME" VARCHAR(50), primary key ("ACCOUNT_ID") diff --git a/test/test_integration.py b/test/test_integration.py index 1eff88b..65ea680 100644 --- a/test/test_integration.py +++ b/test/test_integration.py @@ -162,6 +162,27 @@ class IntegrationTestBase(object): dbl_col, '2008-02-27', valid, product_name ) self.assertEqual(result, exp) + def test_execute_type_time(self): + cursor = self.conn.cursor() + stmt = "insert into ACCOUNT (ACCOUNT_ID, ACCOUNT_NO, BALANCE, " \ + "OPENED_AT_TIME) " \ + "values (?, ?, ?, ?)" + d = self.dbapi + account_id = d.Timestamp(2010, 01, 26, 14, 31, 59) + account_no = 20 + balance = 1.2 + opened_at_time = d.Time(13, 59, 59) + parms = (account_id, account_no, balance, opened_at_time) + cursor.execute(stmt, parms) + stmt = "select ACCOUNT_ID, ACCOUNT_NO, BALANCE, OPENED_AT_TIME " \ + "from ACCOUNT where ACCOUNT_NO = ?" + parms = (20, ) + cursor.execute(stmt, parms) + result = cursor.fetchone() + cursor.close() + exp = ( '2010-01-26 14:31:59', account_no, balance, '13:59:59' ) + self.assertEqual(result, exp) + def test_execute_different_rowcounts(self): cursor = self.conn.cursor() stmt = "insert into ACCOUNT (ACCOUNT_ID, ACCOUNT_NO, BALANCE) " \ @@ -206,6 +227,9 @@ class SqlitePyTest(SqliteTestBase, unittest.TestCase): import sqlite3 return sqlite3, sqlite3.connect(':memory:') + def test_execute_type_time(self): + """Time type not supported by PySqlite""" + class SqliteXerialTest(SqliteTestBase, unittest.TestCase): def connect(self):