使用 web2py 修改 SQL 表模式
Posted
技术标签:
【中文标题】使用 web2py 修改 SQL 表模式【英文标题】:Modifying SQL table schema with web2py 【发布时间】: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重新定义表,方法是删除旧列并在必要时更新现有列的类型?
【问题讨论】:
【参考方案1】:SQLite 是一个特例——阅读here 了解修复损坏的迁移。
【讨论】:
好的,我知道这是一个 SQLite 问题,但文档建议“更新表的所有记录并使用 None 更新相关列中的值。”我的列值已经是 None,那么这有什么帮助呢? 您可以尝试按照 fake_migrate 说明进行操作,看看是否有帮助。以上是关于使用 web2py 修改 SQL 表模式的主要内容,如果未能解决你的问题,请参考以下文章