【问题标题】:NOT NULL not appearing on database table in web2py?NOT NULL 没有出现在 web2py 的数据库表上?
【发布时间】:2014-02-10 05:45:44
【问题描述】:

在我的模型中,我有一个这样定义的表:

db.define_table('address',
    Field('address1','string'),
    Field('address2','string'),
    Field('city','string'),
    Field('state','string'),
    Field('postal_code','string'),
    Field('country','string'),
    )

db.address.address1.notnull = True
db.address.city.notnull = True
db.address.country.notnull = True    

但是,当在数据库 (postgresql) 中生成此表时,相关字段没有 NOT NULL 约束。为什么?以及如何确保添加了NOT NULL约束?

【问题讨论】:

    标签: web2py


    【解决方案1】:

    迁移(包括创建尚不存在的表)在调用 db.define_table() 时完成,因此任何影响实际数据库架构的属性都必须包含在初始字段定义中,而不是之后(您可以设置 web2py -db.define_table() 调用后的特定字段属性,例如“表示”、“需要”、“默认”、“可读”等)。所以,应该是:

    Field('address1','string', notnull=True)
    

    【讨论】:

    • 感谢这适用于普通字段,但它似乎不适用于 Field('customer_id','reference customer', notnull = True) 等外键字段。为什么?以及如何在外键字段上获得 NOT NULL?
    • 不确定为什么会这样,但不要认为您目前可以从 web2py 中做到这一点。请注意,要在提交表单时强制执行 notnull,您将改为(或另外)想要执行 Field('address1', requires=IS_NOT_EMPTY())。这将在提交表单时在 UI 中提供验证和友好的错误消息(而不是简单地抛出数据库异常并返回 500 错误,这是您使用notnull=True 所能得到的全部)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多