Column type "Time" does not work

Issue #335 resolved
Former user created an issue

Version: 0.2.8 / rev1970

Using sqlite with columntype "Time": Error when creating table:


Traceback (most recent call last): File "createdb.py", line 8, in ? metadata.create_all() File "/sqlalchemy/schema.py", line 884, in create_all connectable.run_callable(do) File "/sqlalchemy/engine/base.py", line 459, in run_callable return callable_(conn, args, kwargs) File "/sqlalchemy/schema.py", line 883, in do conn.create(table) File "/sqlalchemy/engine/base.py", line 300, in create return self.__engine.create(entity, connection=self, kwargs) File "/sqlalchemy/engine/base.py", line 402, in create self._run_visitor(self.dialect.schemagenerator, entity, connection=connection, kwargs) File "/sqlalchemy/engine/base.py", line 426, in _run_visitor element.accept_schema_visitor(visitorcallable(self, conn.proxy, connection=conn, *kwargs)) File "/sqlalchemy/schema.py", line 279, in accept_schema_visitor return visitor.visit_table(self) File "/sqlalchemy/ansisql.py", line 635, in visit_table self.append("\t" + self.get_column_specification(column, first_pk=column.primary_key and not first_pk)) File "/sqlalchemy/databases/sqlite.py", line 284, in get_column_specification colspec = self.preparer.format_column(column) + " " + column.type.engine_impl(self.engine).get_col_spec() File "**/sqlalchemy/types.py", line 51, in get_col_spec raise NotImplementedError() NotImplementedError


After fixing this problem another one occurs when selecting a row with minutes greater than 23:

Traceback (most recent call last): File "<stdin>", line 1, in ? File "/sqlalchemy/orm/query.py", line 193, in selectfirst ret = self.select_whereclause(args, params) File "/sqlalchemy/orm/query.py", line 232, in select_whereclause return self._select_statement(statement, params=params) File "/sqlalchemy/orm/query.py", line 305, in _select_statement return self.instances(statement, params=params, kwargs) File "/sqlalchemy/orm/query.py", line 269, in instances return self.mapper.instances(result, self.session, kwargs) File "/sqlalchemy/orm/mapper.py", line 627, in instances self._instance(session, row, imap, result, populate_existing=populate_existing) File "/sqlalchemy/orm/mapper.py", line 1040, in _instance self.populate_instance(session, instance, row, identitykey, imap, isnew) File "/sqlalchemy/orm/mapper.py", line 1070, in populate_instance prop.execute(session, instance, row, identitykey, imap, isnew) File "/sqlalchemy/orm/properties.py", line 50, in execute instance.dictself.key = row[self.columns0] File "/sqlalchemy/engine/base.py", line 658, in getitem return self.__parent._get_col(self.__row, key) File "/sqlalchemy/engine/base.py", line 597, in _get_col return rec0.dialect_impl(self.dialect).convert_result_value(row[rec1], self.dialect) File "*/sqlalchemy/databases/sqlite.py", line 71, in convert_result_value return tup and datetime.time(tup4:7) ValueError: hour must be in 0..23


Comments (5)

  1. Former user Account Deleted

    Trac does not allow appending for "guest"...

    Patch:

    Index: lib/sqlalchemy/databases/sqlite.py
    ===================================================================
    --- lib/sqlalchemy/databases/sqlite.py  (revision 1970)
    +++ lib/sqlalchemy/databases/sqlite.py  (working copy)
    @@ -68,7 +68,7 @@
             return "TIME"
         def convert_result_value(self, value, dialect):
             tup = self._cvt(value, dialect, "%H:%M:%S")
    -        return tup and datetime.time(*tup[4:7](4:7))
    +        return tup and datetime.time(*tup[3:6](3:6))
     class SLText(sqltypes.TEXT):
         def get_col_spec(self):
             return "TEXT"
    @@ -98,6 +98,7 @@
         sqltypes.Float : SLNumeric,
         sqltypes.DateTime : SLDateTime,
         sqltypes.Date : SLDate,
    +    sqltypes.Time : SLTime,
         sqltypes.String : SLString,
         sqltypes.Binary : SLBinary,
    
  2. Former user Account Deleted

    Test:

    from sqlalchemy import *
    
    
    
    db = create_engine('sqlite://')
    metadata = BoundMetaData(db)
    
    testTable = Table('test', metadata, Column('id', Integer(), primary_key = True), Column('time', Time()))
    testTable.create() # fails until adding type 'Time'
    
    class Test(object):
           pass
    
    testMapper = mapper(Test, testTable)
    
    t1 = Test()
    t1.time = '00:30:00'
    
    session = create_session()
    session.save(t1)# fails until fixing convert_result_value
    session.flush()
    
  3. Log in to comment