使用datetime

时间:2018-04-26 09:02:22

标签: web2py

我对Web2Py完全不熟悉并且遇到以下问题:

我正在尝试定义一个数据库,并将当前年份作为一个字段,应该使用datetime自动填充。

但是当我尝试打开数据库并查看条目时,我得到了一个我不理解的追溯(见下文)。

编辑:我认为它必须与strftime只有一个参数做一些事情。当我使用strftime(“%Y%m%d”)时,它工作正常。但我真的只需要当年。

谢谢

代码

导入日期时间

       db.define_table('orders',            
                    Field("current_year", "string",default=datetime.datetime.now().strftime("%Y"),Label=T('Current Year'), readable=True, writable=False))

使用IS_DATETIME的代码

阅读完web2py文档后,我也尝试了这个:

导入日期时间

Field('current_year','string',label = T('Current Year'),default = IS_DATETIME(format = T('%Y')),readable = True,writable = False))

回溯:

追踪(最近一次通话):   文件“/home/PyCatUB/web2py/applications/contacts/controllers/appadmin.py”,第269行,在select中     * fields,limitby =(开始,停止))   文件“/home/PyCatUB/web2py/gluon/packages/dal/pydal/objects.py”,第2020行,在select中     return adapter.select(self.query,fields,attributes)   文件“/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/sqlite.py”,第123行,在select中     return super(SQLiteAdapter,self).select(查询,字段,属性)   文件“/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py”,第1296行,在select中     return self._select_aux(sql,fields,attributes)   在_select_aux中输入文件“/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py”,第1253行     self.execute(SQL)   文件“/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py”,第1388行,执行     return self.log_execute(* a,** b)   在log_execute中输入“/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py”,第1382行     ret = self.get_cursor()。execute(command,* a [1:],** b)   在convert_timestamp中输入文件“/usr/lib/python2.7/sqlite3/dbapi2.py”,第66行     datepart,timepart = val.split(“”) ValueError:解包需要多于1个值

2 个答案:

答案 0 :(得分:2)

Field('current_year', 'string', label=T('Current Year'),
      default=IS_DATETIME(format=T('%Y')),
      readable=True, writable=False))

上面,IS_DATETIME是验证者。它旨在与字段的requires属性一起使用。您不能将其与default属性一起使用。在这种情况下,当您执行插入操作时,它将只插入该验证程序对象的字符串表示形式,其类似于'<gluon.validators.IS_DATETIME object at 0x000002202AC13CC0>'。该字符串显然不是有效的日期时间字符串,因此当dbapi2.py尝试将其解析为时间戳时,您会收到异常。

如果您只想存储年份,更好的方法可能只是使用整数类型并将年份存储为整数:

Field('current_year', 'integer', default=request.now.year)

如上面的评论中所述,SQLite不允许您更改现有字段的类型,因此如果您要为字段使用名称“current_year”,请首先删除现有表并让web2py重新创建它使用新的字段类型从头开始。

答案 1 :(得分:0)

似乎我修好了这个。出于某种原因,web2py不喜欢标签“current_year”。我把它变成了“curyear”,因为我觉得current_year可能是一个保留词 - 而且它有效。这可能是原因吗?