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

Ben*_*ler 10 python sqlalchemy flask-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)
    ...
Run Code Online (Sandbox Code Playgroud)

但是,当我创建一个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>
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

dwa*_*son 11

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

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

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

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


小智 5

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

  • 准确地说 - 他们何时创建“Location”实例并不重要,重要的是他们何时/如何在他们使用的任何 SQL 后端创建表。除非重新创建 SQL 表本身,否则即使重新启动 Python 代码(这将重新加载 `db.Model`)也无法解决问题。我不确定这是否是您的意思,但措辞有点模棱两可。此外,他们不需要使用`Alembic`;他们需要的是实际将“NOT NULL”约束添加到他们的 SQL 表中。 (3认同)