我在修改web2py中的SQL表架构时遇到问题。
db.define_table
中现有字段的字段类型,则SQL列的新类型似乎在web2py中注册,但实际上并未更改数据库中的任何内容,从而导致错误。db.define_table
删除一个字段,它就不会在SQL中消失。我从这样的表开始:
db.define_table('dummy',
Field('name', 'string'),
Field('created', 'date')
)
如果我在SQLite管理器中检查表的create语句,它看起来像这样:
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语句,我会看到以下内容:
CREATE TABLE style(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name CHAR(512),
created DATE,
modified TIMESTAMP)
因此,根据SQLiteManager,新的modified
列是正确的类型,但旧的created
列的类型没有更改。
如果我进入web2py的数据库管理员并编辑一行,它会假装created
和modified
都是日期时间 - 当我编辑这些值时,它会给我一个日期时间弹出编辑器。编辑modified
列工作正常,但如果我编辑created
,则数据库管理员屏幕将无法再执行基本选择查询,而是会给我错误:
无效查询对于基数为10的int()的无效文字:'19 11:33:39'
最后,假设我要删除created
列并重新开始,因此我将其排除在我的代码中:
db.define_table('dummy',
Field('name', 'string'),
Field('modified', 'datetime')
)
但没有任何变化 - 我仍然在SQLite管理器中看到created
列,并且上述错误仍然存在。
我想要做的最后一件事就是直接在SQLite管理器中编辑表格 - 我尝试了一次,因为web2py与数据库完全不同步,所以它变成了一场噩梦。
如何通过删除旧列并在必要时更新现有列的类型来强制web2py 重新定义表?