Python 用web2py修改SQL表模式
在web2py中修改SQL表架构时遇到问题Python 用web2py修改SQL表模式,python,sql,data-access-layer,web2py,Python,Sql,Data Access Layer,Web2py,在web2py中修改SQL表架构时遇到问题 如果我在db.define_table中更改现有字段的字段类型,SQL列的新类型似乎会在web2py中注册,但实际上不会更改数据库中的任何内容,这会导致错误 如果我从db.define\u table中删除一个字段,它在SQL中不会消失 示例1:更改字段类型 我从这样一张桌子开始: db.define_table('dummy', Field('name', 'string'), Field('created', 'date')
db.define_table
中更改现有字段的字段类型,SQL列的新类型似乎会在web2py中注册,但实际上不会更改数据库中的任何内容,这会导致错误db.define\u table
中删除一个字段,它在SQL中不会消失示例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
blank。然后我意识到我希望created
是一个datetime,并且我想添加另一个字段modified
,它也是一个datetime。因此,我将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)
我一开始没有错误。但是,如果我浏览一下create语句,就会看到以下内容:
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)
因此,根据SQLiteManager,新的modified
列是正确的类型,但是旧的created
列的类型没有改变
如果我进入web2py的db admin并编辑一行,它会假装创建的
和修改的
都是datetime-当我编辑这些值时,它会给我一个datetime弹出编辑器。编辑modified
列可以正常工作,但如果我编辑created
,则db admin屏幕将不再能够执行基本的select查询,而是显示错误:
无效查询以10为基数的int()的文本无效:“19 11:33:39”
示例2:删除字段 最后,假设我想删除
created
列并重新开始,因此我将其排除在代码中:
db.define_table('dummy',
Field('name', 'string'),
Field('modified', 'datetime')
)
但是没有任何变化-我仍然可以在SQLite管理器中看到创建的列,并且上面的错误仍然存在
我最不想做的就是直接在SQLite管理器中编辑表——我试过一次,结果变成了一场噩梦,因为web2py与数据库完全不同步
如何通过删除旧列并在必要时更新现有列的类型来强制web2py重新定义表?SQLite是一个特例--请阅读有关修复中断的迁移的内容。好的,我知道这现在是SQLite的问题,但文档建议“正在更新表的所有记录,并使用None更新有问题的列中的值。”我的列值已为None,因此这有何帮助?您可以尝试按照fake_migrate说明进行操作,看看是否有帮助。