SQLAlchemy和空列

25

当我使用SQLAlchemy插入新纪录到数据库时,如果没有填写所有字段,它会将它们都插入为“None”(而不是省略它们)。然后会出现“不能为空”的错误。是否有一种方法,使其在声明实例时也省略掉这些字段,从而在SQL查询中省略掉这些列?

3个回答

70

补充Ali A的回答,这意味着您需要在列定义中添加nullable=True,以便该列允许NULL值。例如:

email_address = Column(String, nullable=True)

SQLAlchemy Tables 和 Columns 文档,摘自 v1.2 版本:

nullable – 当设置为 False 时,在生成列的 DDL 时将会添加“NOT NULL”短语。当设置为 True 时,通常不会生成任何内容(在 SQL 中默认为“NULL”),除非在某些特定的后端特殊情况下,“NULL”可能显式呈现。默认为 True,除非 primary_key 也是 True,这种情况下它默认为 False。此参数仅用于发出 CREATE TABLE 语句。


9
这更直接地回答了问题。 - Scott
我已经将 nullable=True 设置了,但是出现了IntegrityError错误。显示存在NOT NULL约束。 - Morgan Sell

16
这是一个数据库模式问题,而不是SQLAlchemy的问题。如果您的数据库模式有一个不能为NULL的列,那么您必须在其中放置一些东西(即非None)。或者更改模式以允许这些列中包含NULL。
维基百科有一篇关于NULL的文章和一篇描述非NULL约束条件的文章。

1
同意不同意,我目前遇到了与问题相同的问题:该列被定义为timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP。添加的对象没有设置此属性,但SQLAlchemy仍然尝试插入一个NULL值。 - Romuald Brunet

0

如果默认值在模式中已经声明(但带有NOT NULL检查),您可以使用FetchedValue声明它们。

from sqlalchemy.schema import FetchedValue


class Foo(Base):
    date_created = Column(DateTime, server_default=FetchedValue())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接