使用 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 的数据库管理员并编辑一行,它会假装 createdmodified 都是日期时间 - 当我编辑这些值时,它会给我一个日期时间弹出编辑器。编辑 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 表模式的主要内容,如果未能解决你的问题,请参考以下文章

如何修改系统表

web2py官方文档翻译01

在 web2py DAL 中查询空值

web2py dal sql 'like' 等效

如何在 Web2py 中使用 jquery 将数据从视图传输到控制器操作函数

视图模式及T-SQL语句操作管理SQL Server数据库