【发布时间】:2010-10-07 15:07:43
【问题描述】:
当我尝试使用 SQLAlchemy 将新记录插入数据库并且我没有填写所有值时,它会尝试将它们插入为“无”(而不是省略它们)。然后它抱怨“不能为空”错误。如果我在声明实例时也省略了它们,有没有办法让它只省略 sql 查询中的列?
【问题讨论】:
标签: python database-design sqlalchemy
当我尝试使用 SQLAlchemy 将新记录插入数据库并且我没有填写所有值时,它会尝试将它们插入为“无”(而不是省略它们)。然后它抱怨“不能为空”错误。如果我在声明实例时也省略了它们,有没有办法让它只省略 sql 查询中的列?
【问题讨论】:
标签: python database-design sqlalchemy
要添加到 Ali A 的答案,这意味着您需要在列定义中包含 nullable=True,以便列中允许 NULL。例如:
email_address = Column(String, nullable=True)
SQLAlchemy docs for Tables and Columns,摘自 v1.2 文档:
nullable – 当设置为 False 时,将导致“NOT NULL”短语变为 为列生成 DDL 时添加。当 True 时,通常会 什么都不生成(在 SQL 中默认为“NULL”),除了一些非常 可能呈现“NULL”的特定后端特定边缘情况 明确地。默认为 True 除非 primary_key 也为 True,其中 如果它默认为 False。该参数仅在发出时使用 CREATE TABLE 语句。
【讨论】:
这是一个数据库架构问题,而不是 SQLAlchemy 问题。如果您的数据库模式有一个不能为 NULL 的列,您必须在其中放入一些东西(即不是无)。或者更改您的架构以允许在这些列中使用 NULL。
维基百科有一篇文章about NULL和一篇描述non-NULL constraints的文章
【讨论】:
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP。添加的对象尚未设置此属性,但 SQLAlchemy 无论如何都会尝试插入 NULL 值
如果在架构中声明了默认值(但使用NOT NULL 检查),您可以使用FetchedValue 声明它们
from sqlalchemy.schema import FetchedValue
class Foo(Base):
date_created = Column(DateTime, server_default=FetchedValue())
【讨论】: