如何在SQLAlchemy中插入NULL值?

bod*_*ydo 11 python sqlalchemy

我有Table以下一栏:

Column('type', String(128))
Run Code Online (Sandbox Code Playgroud)

在数据库中插入新行时,如何将此列设置为NULL?

我试过这样做:

self.type = NULL;
Run Code Online (Sandbox Code Playgroud)

NULLPython中没有类型,所以我不知道如何做.

小智 28

而不是尝试

self.type = NULL
Run Code Online (Sandbox Code Playgroud)

尝试Yaroslav Admin建议

self.type = None
Run Code Online (Sandbox Code Playgroud)

因为Python与NULL的等价物是None.

  • 这实际上在列中插入“null”。如果您希望您的字段实际上什么都不是,请使用 sqlalchemy 的 `null()`。查看 Ilja Everilä 的回答以获取更多详细信息 (2认同)

ome*_*ell 11

我知道这是一个老线程,但这对我有用

self.type = sqlalchemy.sql.null()
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,它也可以简单地用作“sqlalchemy.null()”(v1.2.5) (4认同)
  • 如果您有 JSONB 列,这很有用,因为“sqlalchemy.sql.null()”(被视为 SQL NULL)和 None(被视为 JSON“null”)之间存在差异,这不是同一件事。 (3认同)

Ilj*_*ilä 5

正如其他答案所指出的那样,可以通过传递显式NULL来插入值None,或者在SQLAlchemy的情况下null(),将值作为值插入。实际上,PEP-249“ DB-API v2.0”在“类型对象和构造函数”中明确指出了这一点:

SQL NULL值由None输入和输出上的Python 单例表示。

作为第三个选项,如果可以为空,则可以简单地忽略该列:

t = Table('t', metadata,
          Column('a', Integer),
          Column('b', Integer))

stmt = t.insert().values(a=1)
engine.execute(stmt)
Run Code Online (Sandbox Code Playgroud)

会有效地(1, NULL)在表中插入新行t,因为没有为column提供值b。映射类也是如此,我想原来的问题实际上是在使用(由于self):

class T(Base):
    __tablename__ = 't'
    id = Column(Integer, primary_key=True)
    a = Column(Integer)
    b = Column(Integer)

session.add(T(a=1))
session.commit()
Run Code Online (Sandbox Code Playgroud)

再次有效地导致(default, 1, NULL)被插入。