Home > Blockchain >  SQLAlchemy Error '(psycopg2.errors.NotNullViolation) null value in column "id" of rel
SQLAlchemy Error '(psycopg2.errors.NotNullViolation) null value in column "id" of rel

Time:11-11

I am aware of a similar issue How to fix error: (psycopg2.errors.NotNullViolation) null value in column "id" violates not-null constraint? but the answers there did not fix my error

I have the following sqlalchemy structure connected to a postgres database

class Injury(db.Model):
    __tablename__ = "injury"

    id = Column(Integer, primary_key=True)
    name = Column(String)
    description = Column(String)

The DDL looks like

create table injury
(
    id               bigint not null
        constraint idx_182837_injury_pkey
            primary key
        constraint injury_id_key
            unique,
    name             text,
    description      text,
);

However, upon trying to insert something into the database like the following

injury = Injury(name='name', description='desc')
session.add(injury)
session.commit()

The following error occurs

Error '(psycopg2.errors.NotNullViolation) null value in column "id" of relation "injury" violates not-null constraint

Upon opening up my debugger, I can verify that the id attribute in the injury object before I commit is None

Why is this occurring? Shouldn't primary_key=True in my schema tell postgres that it is responsible for making the id? I tried playing around with SEQUENCE and IDENTITY but I was getting the same error

CodePudding user response:

you have to tell it to auto increment dont use bigint but serial

id SERIAL PRIMARY KEY

check this how-to-define-an-auto-increment-primary-key-in-postgresql-using-python

CodePudding user response:

This was a result of some form of bug during my transfer from sqlite to postgres when I used pg_loader. I found out someone else encountered this and I followed their instructions and it corrected my issue. The following steps were all done in IntelliJ's database tool

  • Exported all of my data out with pg_dump
  • Reformatted my id schema to look like id = Column(Integer, Identity(start=2116), primary_key=True) where 2116 is one more than the last id i currently have in my database
  • Reloaded data base in with pg_loader

This was working without the Identity field but the key was set to 1 instead of 2116. Looking at this article helped me realize I needed to use the Identity field.

  • Related