当我尝试使用SQLAlchemy将新记录插入数据库并且我没有填写所有值时,它会尝试将它们作为“无”插入(而不是省略它们)。然后它抱怨“不能为空”错误。有没有办法让它只是省略sql查询中的列,如果我在声明实例时也省略了它们?
答案 0 :(得分:46)
要添加Ali A的答案,这意味着您需要在列定义中使用nullable=True
,以便在列中允许NULL。例如:
email_address = Column(String, nullable=True)
SQLAlchemy docs for Tables and Columns,摘自v1.2 doc:
nullable - 设置为False时,将导致“NOT NULL”短语 在为列生成DDL时添加。当为True时,通常会 什么都不生成(在SQL中默认为“NULL”),除非在某些情况下 特定的后端特定边缘情况,其中“NULL”可以呈现 明确。默认为True,除非primary_key也为True,其中 case默认为False。此参数仅在发布时使用 CREATE TABLE语句。
答案 1 :(得分:14)
这是数据库架构问题,而不是SQLAlchemy问题。如果您的数据库模式具有不能为NULL的列,则必须将某些内容(即非None)放入其中。或者更改您的架构以在这些列中允许NULL。
维基百科有一篇文章about NULL和一篇描述non-NULL constraints
的文章答案 2 :(得分:0)
如果在架构中声明了默认值(但使用 NOT NULL
检查),您可以使用 FetchedValue
声明它们
from sqlalchemy.schema import FetchedValue
class Foo(Base):
date_created = Column(DateTime, server_default=FetchedValue())