gpt4 book ai didi

python - 使用 web2py 修改 SQL 表模式

转载 作者:太空宇宙 更新时间:2023-11-03 15:25:04 26 4
gpt4 key购买 nike

我在 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,则数据库管理屏幕不再能够执行基本的选择查询,而是给我错误:

Invalid Query invalid literal for int() with base 10: '19 11:33:39'


示例 2:删除字段

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

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

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


我最不想做的是直接在 SQLite 管理器中编辑表 - 我试过一次,结果变成了一场噩梦,因为 web2py 与数据库完全不同步。

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

最佳答案

SQLite 是一个特例——阅读 here关于修复中断的迁移。

关于python - 使用 web2py 修改 SQL 表模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8565024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com