Привет, я пытаюсь разработать функциональность вставки с использованием python и postgress

#python #sql #postgresql #psycopg2

#python #sql #postgresql #psycopg2

Вопрос:

Привет, я пытаюсь разработать функциональность вставки с использованием python и postgress sql. Чего я пытаюсь добиться, так это того, что при вставке значения идентификатор должен автоматически увеличиваться, поскольку я установил его таким образом. Но все равно выдает ошибку, отличную от нуля. См. Ошибку ниже

Это мой текущий код:

 def insert(car_make,car_model,year,first_owner,vinnumber):
    conn=psycopg2.connect("dbname='Car_Inventory_db' user='postgres' password='password' host='localhost' port='5432'")
    cur=conn.cursor()
    cur.execute("INSERT into carInventory(car_make,car_model,year,first_owner,vinnumber) VALUES (%s, %s, %s, %s, %s)", (car_make,car_model,year,first_owner,vinnumber))
    conn.commit()
    conn.close()
 

Ошибка, которую я получаю:

 psycopg2.errors.NotNullViolation: null value in column "id" of relation "carinventory" violates not-null constraint
DETAIL:  Failing row contains (null, Honda, Civic, 2003, true, 3sdfSKHAN).
 

Вот как я создал свою таблицу

 def connect():
   conn=psycopg2.connect("dbname='Car_Inventory_db' user='postgres' password='password' host='localhost' port='5432'")
   cur=conn.cursor()
   cur.execute("""CREATE TABLE IF NOT EXISTS carInventory(
    id integer PRIMARY KEY,
    car_make text,
    car_model text,
    year integer,
    first_owner boolean,
    vinnumber varchar(17)
)
""")
   conn.commit()
   conn.close()
 

Как мне избежать ошибки, чтобы мой код принимал все значения и только автоматически увеличивал столбец id на основе инструкции insert

Ответ №1:

Используйте тип данных SERAIL в определении таблицы.

Это сделает автоматическое увеличение для вас.

   id SERIAL PRIMARY KEY
 

Подробнее см. Здесь.

Ответ №2:

Начиная с Postgres v10, предпочтительным методом является определение вашего id как сгенерированного столбца идентификаторов.

 create table carinventory(                                                                                                                         
             id integer  generated always as identity                                                                                              
                         primary key                                                                                                               
           , car_make text                                                                                                                         
           , car_model text                                                                                                                        
           , year integer                                                                                                                          
           , first_owner boolean                                                                                                                   
           , vinnumber varchar(17)                                                                                                                 
           ) ;