使用web2py修改SQL表模式

时间:2011-12-19 17:26:23

标签: python sql data-access-layer web2py

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

  1. 如果我更改db.define_table中现有字段的字段类型,则SQL列的新类型似乎在web2py中注册,但实际上并未更改数据库中的任何内容,从而导致错误。
  2. 如果我从db.define_table删除一个字段,它就不会在SQL中消失。

  3. 示例1:更改字段类型

    我从这样的表开始:

    db.define_table('dummy',
        Field('name', 'string'),
        Field('created', 'date')
        )
    

    如果我在SQLite管理器中检查表的create语句,它看起来像这样:

    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,则数据库管理员屏幕将无法再执行基本选择查询,而是会给我错误:

      

    无效查询对于基数为10的int()的无效文字:'19 11:33:39'


    示例2:删除字段

    最后,假设我要删除created列并重新开始,因此我将其排除在我的代码中:

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

    但没有任何变化 - 我仍然在SQLite管理器中看到created列,并且上述错误仍然存​​在。


    我想要做的最后一件事就是直接在SQLite管理器中编辑表格 - 我尝试了一次,因为web2py与数据库完全不同步,所以它变成了一场噩梦。

    如何通过删除旧列并在必要时更新现有列的类型来强制web2py 重新定义表?

1 个答案:

答案 0 :(得分:4)

SQLite是一个特例 - 阅读here关于修复损坏的迁移。