【问题标题】:SQLAlchemy and empty columnsSQLAlchemy 和空列
【发布时间】:2010-10-07 15:07:43
【问题描述】:

当我尝试使用 SQLAlchemy 将新记录插入数据库并且我没有填写所有值时,它会尝试将它们插入为“无”(而不是省略它们)。然后它抱怨“不能为空”错误。如果我在声明实例时也省略了它们,有没有办法让它只省略 sql 查询中的列?

【问题讨论】:

    标签: python database-design sqlalchemy


    【解决方案1】:

    要添加到 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 语句。

    【讨论】:

    • 这更直接地回答了问题
    【解决方案2】:

    这是一个数据库架构问题,而不是 SQLAlchemy 问题。如果您的数据库模式有一个不能为 NULL 的列,您必须在其中放入一些东西(即不是无)。或者更改您的架构以允许在这些列中使用 NULL。

    维基百科有一篇文章about NULL和一篇描述non-NULL constraints的文章

    【讨论】:

    • 同意不同意,我目前遇到的问题与问题完全相同:列定义为timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP。添加的对象尚未设置此属性,但 SQLAlchemy 无论如何都会尝试插入 NULL
    【解决方案3】:

    如果在架构中声明了默认值(但使用NOT NULL 检查),您可以使用FetchedValue 声明它们

    from sqlalchemy.schema import FetchedValue
    
    
    class Foo(Base):
        date_created = Column(DateTime, server_default=FetchedValue())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2021-01-08
      • 2015-03-25
      • 2015-06-01
      相关资源
      最近更新 更多