es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Hola, estoy tratando de desarrollar funcionalidad de inserción utilizando Python y PostgreSQL.

Hola, estoy tratando de desarrollar la funcionalidad de inserción utilizando Python y PostgreSQL. Lo que estoy tratando de lograr es que cuando inserte un valor, el id se incremente automáticamente como lo he configurado. Pero aún me da un error de “non null”. A continuación puedes ver el error:

Este es mi código actual:

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()

Error que estoy recibiendo:

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).

Así es como he creado mi tabla:

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()

¿Cómo puedo evitar este error para que mi código acepte todos los valores y solo incremente automáticamente la columna id basándose en la declaración de inserción?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar el error, debes modificar tu declaración INSERT para excluir la columna id para que pueda ser autoincrementada por la base de datos. Aquí te mostramos cómo puedes modificar tu función insert:

    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) RETURNING id", (car_make, car_model, year, first_owner, vinnumber))
        id = cur.fetchone()[0]
        conn.commit()
        conn.close()
        return id
    

    En este código modificado, hemos eliminado la columna id de la declaración INSERT y hemos agregado la cláusula RETURNING id al final para que el id recién generado sea devuelto por la base de datos. También obtenemos el id del cursor y lo devolvemos desde la función.

    Con esta modificación, puedes llamar a la función insert y esta insertará los valores y generará un nuevo id para el registro. Por ejemplo:

    new_id = insert('Honda', 'Civic', 2003, True, '3sdfSKHAN')
    print(new_id)
    

    Esto insertará un nuevo registro con los valores dados y devolverá el id recién generado para el registro.

Comments are closed.