如何在SQLAlchemy中为列插入数据库的默认值?

时间:2016-02-24 15:33:50

标签: python postgresql sqlalchemy

我试图在Postgresql表中插入一行,如下所示:

class LaunchId(Base):
    """Launch ID table for runs"""
    __tablename__ = 'launch_ids'

    id = Column(Integer, primary_key=True)
    launch_time = Column(DateTime)

我的班级看起来像这样:

launch_time

default=datetime.datetime.utcnow()应由数据库管理。我知道可以使用default=func.now(),但是它会使用客户端上的当前时间。我知道可以使用launch_ids,但这意味着如果数据库的默认定义发生变化,那么我需要在两个地方更改默认值。

以下是我尝试在l = LaunchId() session.add(l) session.commit() IntegrityError: (psycopg2.IntegrityError) null value in column "launch_time" violates not-null constraint DETAIL: Failing row contains (1, null). [SQL: 'INSERT INTO launch_ids (launch_time) VALUES (%(launch_time)s) RETURNING launch_ids.id'] [parameters: {'launch_time': None}] 中插入行而未指定值时获得的内容:

front:
    pattern: .*
    # ...
    access_denied_url: /user/login

2 个答案:

答案 0 :(得分:1)

使用FetchedValue

from sqlalchemy.schema import FetchedValue

class LaunchId(Base):
    ...
    launch_time = Column(DateTime, FetchedValue())

答案 1 :(得分:0)

在列上指定server_default,如下所示:

class LaunchId(Base):
    """Launch ID table for runs"""
    __tablename__ = 'launch_ids'

    id = Column(Integer, primary_key=True)
    launch_time = Column(DateTime, nullable=False
                         server_default=text("(now() at time zone 'utc')"))

然后通过会话添加新的launch_id将起作用。 server_defaultdefault的工作方式不同,因为它是在服务器端生成的。官方SQLAlchemy文档:http://docs.sqlalchemy.org/en/latest/core/defaults.html#server-side-defaults

通过指定nullable=False,此模型也会成为您指定的CREATE TABLE的真实反映,因此可以通过Base.metadata.create_all或使用alembic生成。