Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用web2py修改SQL表模式_Python_Sql_Data Access Layer_Web2py - Fatal编程技术网

Python 用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')

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

  • 如果我在
    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说明进行操作,看看是否有帮助。