【问题标题】:How does `nullable=False` work in SQLAlchemy`nullable=False` 如何在 SQLAlchemy 中工作
【发布时间】:2016-01-16 11:32:04
【问题描述】:

来自 SQLAlchemy 文档:

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

我认为为 Column 设置 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>

发生了什么事?

【问题讨论】:

标签: python sqlalchemy flask-sqlalchemy


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 确切地说 - 他们何时创建 Location 实例并不重要,重要的是他们何时/如何在他们使用的任何 SQL 后端创建表。除非重新创建 SQL 表本身,否则即使重新启动 Python 代码(这将重新加载 db.Model)也无法解决问题。我不确定这是否是您的意思,但措辞有点模棱两可。此外,他们不需要使用Alembic;他们需要将NOT NULL 约束实际添加到他们的SQL 表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2012-07-11
    • 2011-02-23
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多