- attached testcase02.py
Missing func.now() in SQLite
Issue #708
resolved
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)
-
Account Deleted -
repo owner - changed status to duplicate
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)
- Log in to comment
SQLite func.now() traceback