我试图在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
答案 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_default
与default
的工作方式不同,因为它是在服务器端生成的。官方SQLAlchemy文档:http://docs.sqlalchemy.org/en/latest/core/defaults.html#server-side-defaults
通过指定nullable=False
,此模型也会成为您指定的CREATE TABLE
的真实反映,因此可以通过Base.metadata.create_all
或使用alembic
生成。