使用web2py修改SQL表结构

3 投票
1 回答
2978 浏览
提问于 2025-04-17 08:39

我在使用web2py修改SQL表结构时遇到了一些问题。

  1. 如果我在db.define_table中更改一个已有字段的类型,虽然web2py会识别这个新类型,但实际上数据库里的内容并没有改变,这就导致了错误。
  2. 如果我从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的数据库管理界面并编辑一行,它会假装createdmodified都是日期时间格式——当我编辑这些值时,它会弹出一个日期时间编辑器。编辑modified列是没问题的,但如果我编辑created,那么数据库管理界面就无法执行基本的查询,而是给我报错:

无效查询:无效的整数字面量:'19 11:33:39'


例子2:删除字段

最后,假设我想删除created列并重新开始,所以我在代码中把它排除了:

db.define_table('dummy',
    Field('name', 'string'),
    Field('modified', 'datetime')
    )

但什么都没改变——我在SQLite管理工具中仍然能看到created列,之前的错误依然存在。


我最后想直接在SQLite管理工具中编辑这个表——我试过一次,结果变得一团糟,因为web2py和数据库完全不同步。

我该如何强制web2py重新定义表,删除旧列并在必要时更新现有列的类型呢?

1 个回答

4

SQLite 是一个特殊的情况——你可以在 这里 了解如何修复损坏的迁移。

撰写回答