Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I insert the database's default for a column in SQLAlchemy?

I'm trying to insert a row into a Postgresql table that looks like this:

CREATE TABLE launch_ids(
  id SERIAL PRIMARY KEY,
  launch_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT
    (now() at time zone 'utc')
);

My class looks like this:

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

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

The launch_time should be managed by the database. I know it's possible to use default=datetime.datetime.utcnow(), but that uses the current time on the client. I know it's possible to use default=func.now(), but that means that if the database's definition of the default changes, then I need to change the default in two places.

Here is what I get when I try to insert a row in launch_ids without specifying a value:

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}]
like image 848
Jim Hunziker Avatar asked Nov 17 '25 03:11

Jim Hunziker


1 Answers

Use FetchedValue:

from sqlalchemy.schema import FetchedValue

class LaunchId(Base):
    ...
    launch_time = Column(DateTime, FetchedValue())
like image 150
Craig Burgler Avatar answered Nov 18 '25 17:11

Craig Burgler



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!