数据库
首页 > 数据库> > python-使用web2py修改SQL表架构

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