【问题标题】:Modifying SQL table schema with web2py使用 web2py 修改 SQL 表模式
【发布时间】:2012-01-23 19:13:50
【问题描述】:

我在 web2py 中修改 SQL 表架构时遇到问题。

  1. 如果我更改db.define_table 中现有字段的字段类型,SQL 列的新类型似乎已在 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 语句,我会看到以下内容:

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重新定义表,方法是删除旧列并在必要时更新现有列的类型?

【问题讨论】:

    标签: python sql data-access-layer web2py


    【解决方案1】:

    SQLite 是一个特例——阅读here 了解修复损坏的迁移。

    【讨论】:

    • 好的,我知道这是一个 SQLite 问题,但文档建议“更新表的所有记录并使用 None 更新相关列中的值。”我的列值已经是 None,那么这有什么帮助呢?
    • 您可以尝试按照 fake_migrate 说明进行操作,看看是否有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多