python-使用web2py修改SQL表架构
作者:互联网
我在修改web2py中的SQL表架构时遇到问题.
>如果我更改db.define_table中现有字段的字段类型,则SQL列的新类型似乎已在web2py中注册,但实际上并未更改数据库中的任何内容,这会导致错误.
>如果我从db.define_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)
我插入了一些记录,但留为空白.然后,我意识到我想创建一个日期时间,并且想要添加另一个字段(也就是日期时间)进行修改.所以我将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,新修改的列是正确的类型,但是旧创建的列的类型未更改.
如果我随后进入web2py的数据库管理员并编辑一行,它会假装创建和修改的都是datetime,当我编辑这些值时,它会给我一个datetime弹出式编辑器.编辑修改后的列可以正常工作,但是如果我编辑创建的列,那么db admin屏幕将不再能够执行基本的选择查询,而是出现错误:
Invalid Query invalid literal for int() with base 10: ’19 11:33:39′
示例2:删除字段
最后,假设我要删除创建的列并重新开始,因此我将其排除在代码外:
db.define_table('dummy',
Field('name', 'string'),
Field('modified', 'datetime')
)
但是没有任何变化-我仍然在SQLite管理器中看到创建的列,并且上述错误仍然存在.
我要做的最后一件事是直接在SQLite管理器中编辑表-我尝试了一次,由于web2py与数据库完全不同步,这变成了一场噩梦.
如何通过删除旧列并在必要时更新现有列的类型来强制web2py重新定义表?
解决方法:
SQLite是一种特例-请阅读here,了解如何修复损坏的迁移.
标签:web2py,data-access-layer,python,sql 来源: https://codeday.me/bug/20191101/1987117.html