【问题标题】:Can not add a NOT NULL with default value NONE in sqlite3 and web2py无法在 sqlite3 和 web2py 中添加具有默认值 NONE 的 NOT NULL
【发布时间】:2015-11-30 08:21:42
【问题描述】:

我正在尝试在 web2py 的默认 sqlite3 数据库中创建一个名为“company”的表。这是我的代码-

db.define_table('company',
           Field('company_name', notnull=True, unique=True),
           Field('email'),
           Field('phone', notnull=True),
           Field('url3'),
           format = '%(company_name)s'
           )

db.company.email.requires = IS_EMAIL()
db.company.url3.requires = IS_EMPTY_OR(IS_URL())

运行代码后,我遇到了错误-

<class 'sqlite3.OperationalError'> Cannot add a NOT NULL column with default value NULL

我追踪了 web2py 发出的票证。这表明我在这一行有错误-

format = '%(company_name)s'

如果有人向我解释这里发生了什么,这对我真的很有帮助?以及如何克服这个错误?

【问题讨论】:

    标签: sqlite web2py


    【解决方案1】:

    如果这是一个现有表,并且您正在添加/更新company_name 列,sqlite 在添加没有默认值的 NOT NULL 列时会报错(请参阅here)。

    如果表中没有记录,您可以简单地删除表并从头开始创建它。如果有记录,可以先导出已有数据,再重新建表,再将原数据导入新表。

    另外,请注意 web2py 不会迁移 notnullunique 等字段属性的更改。

    【讨论】:

    • 抱歉回复晚了。感谢您的回答。我现在明白了这个问题。我试图删除表“db.company.drop()”,然后在删除后立即重新创建它。但显然,根据文档:“在您将文件系统导航到应用程序的数据库目录并删除与删除的表关联的文件之前,web2py 不会重新创建删除的表。”我已经导航到我的应用程序的数据库目录。但我找不到确切的数据库文件。看来,sqlite3 很烂。
    • 在 /web2py/applications/yourapp/databases 中,您没有看到名为 [long_random_string]_company.table 的文件?如果没有,当您运行应用程序时会发生什么——它是否尝试重新创建“公司”表?确保已启用迁移。
    • 感谢命名说明。我找到了 .........company.table 文件并将其删除。但是又出现了一个奇怪的问题。我删除了drop table行,运行后,现在显示“table company已经存在”。这很奇怪,因为我刷新了我的目录,但现在看不到任何“..company.table”。
    • 确保该表已实际从数据库中删除。
    猜你喜欢
    • 2011-03-11
    • 2018-01-25
    • 2012-04-08
    • 2014-01-16
    • 2014-11-19
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多