来自SQLAlchemy docs:
nullable - 如果设置为默认值True,则表示该列将为 呈现为允许NULL,否则呈现为NOT NULL。这个 参数仅在发出CREATE TABLE语句时使用。
我认为为列设置nullable=True
基本上使得列需要。例如:
class Location(db.Model):
__tablename__ = 'locations'
id = db.Column(db.Integer, primary_key=True)
latitude = db.Column(db.String(50), nullable=False)
...
但是,当我创建一个没有纬度字段的Location
实例时,我不会收到错误!
Python 2.7.8 (default, Oct 19 2014, 16:02:00)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> Location(latitude=None)
<app.models.Location object at 0x10dce9dd0>
发生了什么事?
答案 0 :(得分:6)
您引用的文档解释了该问题:
此参数仅在发出CREATE TABLE语句时使用。
如果您最初创建的数据库没有nullable=False
(或者以其他方式创建数据库,与SQLAlchemy分开,在该列上没有NOT NULL
),那么您的数据库列没有约束信息。此信息存在于数据库列的引用中,而不是您正在创建/插入的特定实例。
更改SQLAlchemy表创建,而不重建表,意味着不会反映更改。正如评论中的链接所解释的那样,SQLAlchemy没有在该级别进行验证(您需要使用@validates
装饰器或其他类似的东西)。
答案 1 :(得分:3)
当您第一次创建Location实例并将其提交到数据库时,'nullable'是否设置为True?如果是这样,sqlalchemy将不允许您随后将可为空的参数重置为'False'。您必须使用Alembic
迁移数据库