Missing func.now() in SQLite

Issue #708 resolved
Former user created an issue

SQLite with default=func.now() Column definition fails on insert

Testcase:

import sqlalchemy as sqa
import datetime


db = sqa.create_engine("sqlite://")
metadata = sqa.BoundMetaData(db)

#metadata.engine.echo = True # debug output

events_table = sqa.Table('events', metadata,
  sqa.Column('id', sqa.Integer, primary_key=True),
  sqa.Column('name', sqa.String(255)),
  sqa.Column('datetime', sqa.DateTime, default=sqa.func.now()),
)
events_table.create()

i = events_table.insert()
name = "just-a-name"
i.execute(name = name)

The error message:

Traceback (most recent call last):
  File "D:\testcase02.py", line 19, in ?
    i.execute(name = name)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\sql.py", line 1207, in execute
    return self.compile(bind=self.bind, parameters=compile_params).execute(*multiparams, **params)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\sql.py", line 1097, in execute
    return e.execute_compiled(self, *multiparams, **params)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 780, in execute_compiled
    return connection.execute_compiled(compiled, *multiparams, **params)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 567, in execute_compiled
    context.pre_exec()
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\default.py", line 200, in pre_exec
    self._process_defaults()
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\default.py", line 302, in _process_defaults
    newid = drunner.get_column_default(c)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 1235, in get_column_default
    return column.default.accept_visitor(self)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\schema.py", line 840, in accept_visitor
    return visitor.visit_column_default(self)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 1276, in visit_column_default
    return self.exec_default_sql(default)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 1264, in exec_default_sql
    return self.connection.execute_compiled(c).scalar()
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 568, in execute_compiled
    self._execute_raw(context)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 581, in _execute_raw
    self._execute(context)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 599, in _execute
    raise exceptions.SQLError(context.statement, context.parameters, e)
sqlalchemy.exceptions.SQLError: (OperationalError) no such function: now u'SELECT now()' [workaround
{{{
#!diff
--- sqlalchemy/databases/sqlite_old.py  Sat Jul 21 03:18:32 2007
+++ sqlalchemy/databases/sqlite.py  Thu Aug 02 15:10:01 2007
@@ -325,6 +325,12 @@
                 self.typemap.setdefault("CAST", cast.type)
             self.strings[cast](]

Possible) = self.stringscast.clause

  • def visit_function( self , func ):
  • if func.name.lower() == 'now':
  • self.stringsfunc = 'DATETIME("NOW")'
  • else:
  • ansisql.ANSICompiler.visit_function( self , func )
  • def limit_clause(self, select): text = "" if select.limit is not None: }}}

But it also fails

Traceback (most recent call last):
  File "D:\testcase02.py", line 19, in ?
    i.execute(name = name)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\sql.py", line 1207, in execute
    return self.compile(bind=self.bind, parameters=compile_params).execute(*multiparams, **params)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\sql.py", line 1097, in execute
    return e.execute_compiled(self, *multiparams, **params)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 780, in execute_compiled
    return connection.execute_compiled(compiled, *multiparams, **params)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\base.py", line 567, in execute_compiled
    context.pre_exec()
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\default.py", line 201, in pre_exec
    self.parameters = self._encode_param_keys(self.dialect.convert_compiled_params(self.compiled_parameters))
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\engine\default.py", line 120, in convert_compiled_params
    parameters = parameters.get_raw_list()
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\sql.py", line 864, in get_raw_list
    return [for key in self.positional](self.get_processed(key))
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\sql.py", line 845, in get_processed
    return bind.typeprocess(value, self.dialect)
  File "C:\Tools\Python24\Lib\site-packages\sqlalchemy\sql.py", line 1883, in typeprocess
    return self.type.dialect_impl(dialect).convert_bind_param(value, dialect)
  File "C:\Tools\Python24\lib\site-packages\sqlalchemy\databases\sqlite.py", line 38, in convert_bind_param
    return value.strftime(self.__format__)
AttributeError: 'unicode' object has no attribute 'strftime'

Comments (2)

  1. Mike Bayer repo owner

    having now() work on sqlite is part of #615.

    the better function to be called is the ANSI standard "current_timestamp()" which will give you the results you want.

    however, for your second error, you need to call it with result conversion on, like so:

    func.current_timestamp(type=DateTime)
    
  2. Log in to comment