【发布时间】:2012-01-23 19:13:50
【问题描述】:
我在 web2py 中修改 SQL 表架构时遇到问题。
- 如果我更改
db.define_table中现有字段的字段类型,SQL 列的新类型似乎已在 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 语句,我会看到以下内容:
CREATE TABLE style(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name CHAR(512),
created DATE,
modified TIMESTAMP)
所以根据 SQLiteManager,新的modified 列是正确的类型,但旧的created 列的类型没有改变。
如果我随后进入 web2py 的数据库管理员并编辑一行,它会假装 created 和 modified 都是日期时间 - 当我编辑这些值时,它会给我一个日期时间弹出编辑器。编辑 modified 列可以正常工作,但如果我编辑 created,则 db 管理屏幕不再能够执行基本的选择查询,而是给我错误:
Invalid Query int() 的无效文字,基数为 10:'19 11:33:39'
示例 2:删除字段
最后,假设我想删除 created 列并重新开始,所以我将其排除在我的代码中:
db.define_table('dummy',
Field('name', 'string'),
Field('modified', 'datetime')
)
但没有任何变化——我仍然在 SQLite 管理器中看到 created 列,并且上述错误仍然存在。
我想做的最后一件事是直接在 SQLite 管理器中编辑表 - 我尝试过一次,结果变成了一场噩梦,因为 web2py 与数据库完全不同步。
如何强制 web2py重新定义表,方法是删除旧列并在必要时更新现有列的类型?
【问题讨论】:
标签: python sql data-access-layer web2py