使用web2py修改SQL表结构
我在使用web2py修改SQL表结构时遇到了一些问题。
- 如果我在
db.define_table
中更改一个已有字段的类型,虽然web2py会识别这个新类型,但实际上数据库里的内容并没有改变,这就导致了错误。 - 如果我从
db.define_table
中删除一个字段,它在SQL中依然存在。
例子1:更改字段类型
我开始时有一个这样的表:
db.define_table('dummy',
Field('name', 'string'),
Field('created', 'date')
)
如果我在SQLite管理工具中查看这个表的创建语句,它看起来是这样的:
CREATE TABLE style(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name CHAR(512),
created DATE)
我已经插入了一些记录,但created
字段留空了。然后我意识到我想把created
改成日期时间格式,并且想添加一个新的字段modified
,它也是日期时间格式。所以我把db.py改成了这样:
db.define_table('dummy',
Field('name', 'string'),
Field('created', 'datetime'),
Field('modified', 'datetime')
)
最开始没有错误。但是,如果我查看创建语句,我发现:
CREATE TABLE style(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name CHAR(512),
created DATE,
modified TIMESTAMP)
根据SQLite管理工具,新添加的modified
列类型是正确的,但旧的created
列的类型没有改变。
如果我进入web2py的数据库管理界面并编辑一行,它会假装created
和modified
都是日期时间格式——当我编辑这些值时,它会弹出一个日期时间编辑器。编辑modified
列是没问题的,但如果我编辑created
,那么数据库管理界面就无法执行基本的查询,而是给我报错:
无效查询:无效的整数字面量:'19 11:33:39'
例子2:删除字段
最后,假设我想删除created
列并重新开始,所以我在代码中把它排除了:
db.define_table('dummy',
Field('name', 'string'),
Field('modified', 'datetime')
)
但什么都没改变——我在SQLite管理工具中仍然能看到created
列,之前的错误依然存在。
我最后想直接在SQLite管理工具中编辑这个表——我试过一次,结果变得一团糟,因为web2py和数据库完全不同步。
我该如何强制web2py重新定义表,删除旧列并在必要时更新现有列的类型呢?