繁体   English   中英

`nullable = False`如何在SQLAlchemy中工作

[英]How does `nullable=False` work in SQLAlchemy

来自SQLAlchemy docs:

nullable - 如果设置为默认值True,则表示该列将呈现为允许NULL,否则呈现为NOT NULL。 此参数仅在颁发CREATE TABLE语句时使用。

我认为为一个列设置nullable=True基本上使得Column需要。 例如:

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>

到底是怎么回事?

您引用的文档解释了该问题:

此参数仅在颁发CREATE TABLE语句时使用。

如果您最初创建的数据库没有nullable=False (或以其他方式创建它,与SQLAlchemy分开,在该列上没有NOT NULL ),那么您的数据库没有该约束信息。 此信息存在于数据库列的引用中,而不是您正在创建/插入的特定实例。

在不重建表的情况下更改SQLAlchemy表创建意味着不会反映更改。 正如评论中的链接所解释的那样,SQLAlchemy没有在该级别进行验证(您需要使用@validates装饰器或其他类似的东西)。

当您第一次创建Location实例并将其提交到数据库时,'nullable'是否设置为True? 如果是这样,sqlalchemy将不允许您随后将可为空的参数重置为'False'。 您必须使用Alembic迁移数据库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM