我是Web2Py的新手,有以下问题:
我正在尝试定义一个数据库,并将当前年份作为一个字段,应该使用datetime自动填充 .
但是当我尝试打开数据库并查看条目时,我得到了一个我不理解的追溯(见下文) .
编辑:我认为它必须与strftime只有一个参数做一些事情 . 当我使用strftime(“%Y%m%d”)时,它工作得很好 . 但我真的只需要今年 .
谢谢
Code
导入日期时间
db.define_table('orders',
Field("current_year", "string",default=datetime.datetime.now().strftime("%Y"),Label=T('Current Year'), readable=True, writable=False))
Code using IS_DATETIME
阅读web2py文档后我也尝试了这个:
导入日期时间
字段('current_year','string',label = T('Current Year'),default = IS_DATETIME(format = T('%Y')),readable = True,writable = False))
Traceback:
回溯(最近一次调用最后一次):文件“/home/PyCatUB/web2py/applications/contacts/controllers/appadmin.py”,第269行,在select 字段中,limitby =(start,stop))文件“/ 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(query,fields,attributes)文件”/ home / PyCatUB / web2py / gluon / packages / dal / pydal / adapters / base . py“,第1296行,在select中返回self._select_aux(sql,fields,attributes)文件”/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py“,第1253行,在_select_aux self中 . 执行(sql)文件“/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py”,第1388行,执行返回self.log_execute( a,** b)文件“/ home / PyCatUB / web2py / gluon / packages / dal / pydal / adapters / base.py“,第1382行,在log_execute中ret = self.get_cursor() . 执行(命令,* a [1:],** b)文件” /usr/lib/python2.7/sqlite3/dbapi2.py“,第66行,在convert_timestamp datepart中,timepart = val.split(”“)ValueError:需要多于1个值才能解压缩
2 回答
上面,
IS_DATETIME
是验证器 . 它旨在与字段的requires
属性一起使用 . 您不能将它与default
属性一起使用 . 在这种情况下,当您执行插入操作时,它将简单地插入该验证器对象的字符串表示形式,其类似于'<gluon.validators.IS_DATETIME object at 0x000002202AC13CC0>'
. 该字符串显然不是有效的日期时间字符串,因此当dbapi2.py
尝试将其解析为时间戳时,您会收到异常 .如果您只想存储年份,更好的方法可能只是使用整数类型并将年份存储为整数:
如上面的注释中所述,SQLite不允许您更改现有字段的类型,因此如果要对字段使用名称“current_year”,请首先删除现有表,然后让web2py从头开始重新创建它使用新的字段类型 .
好像我修好了这个 . 出于某种原因,web2py不喜欢标签“current_year” . 我将其改为“curyear”,因为我感觉current_year可能是一个保留词 - 而且它有效 . 这可能是原因吗?