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.

ID obtuvo un valor nulo en json (id=null) RESTapi Python flask sqlite. ¿Qué hacer si id es igual a null?

Usando el framework Flask, he creado una tabla en SQLite con 3 filas (id, autor, título). Mientras ejecuto el programa, id es igual a null (id=null) en formato JSON. Por favor, ayúdame con esto.
He creado 2 archivos en Python, app.py para ejecutar mi código en el framework Flask y db.py para crear una base de datos en SQLite.

Archivo app.py:

from flask import Flask, request, jsonify
import sqlite3
import json

app = Flask('name')

def db_connection():
    conn = None
    try:
        conn = sqlite3.connect('books.sqlite')
    except sqlite3.error as e:
        print(e)
    return conn

@app.route('/books', methods=['GET','POST'])
def books():
    conn = db_connection()
    cursor = conn.cursor()

    if request.method == 'GET':
        cursor = conn.execute("SELECT * FROM books")
        books = [
            dict(id=row[0], author=row[1], title=row[2])
            for row in cursor.fetchall()
        ]
        if books is not None:
            return jsonify(books)

    if request.method == 'POST':
        new_author = request.form['author']
        new_title = request.form['title']
        sql = """
            INSERT INTO books (author, title) VALUES (?,?)
        """
        cursor = cursor.execute(sql, (new_author, new_title))
        conn.commit()

        return f'Libro con el id: {cursor.lastrowid} creado exitosamente', 201

Archivo db.py:

import sqlite3

conn = sqlite3.connect("books.sqlite")

cursor = conn.cursor()

sql_query = """ 
    CREATE TABLE books (
        id int AUTOINCREMENT PRIMARY KEY,
        author varchar(255) NOT NULL,
        title varchar(255) NOT NULL
    )
"""

cursor.execute(sql_query)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que la columna id se está estableciendo en el lado de la base de datos como AUTO_INCREMENT, lo que significa que se generará automáticamente cada vez que se inserte un nuevo registro, y no será proporcionado por el usuario (de ahí el valor null en la respuesta JSON). Una columna AUTO_INCREMENT también necesita ser declarada como clave primaria para garantizar la unicidad de sus valores.

    Para resolver esto, cambie la declaración CREATE TABLE en db.py para declarar explícitamente la columna id como clave primaria y autoincremental, y elimine el parámetro id de la instrucción INSERT INTO en app.py. Los archivos modificados se verían así:

    Archivo app.py

    from flask import Flask, request, jsonify
    import sqlite3
    import json
    
    app = Flask(__name__)
    
    def db_connection():
        conn = None
        try:
            conn = sqlite3.connect('books.sqlite')
        except sqlite3.error as e:
            print(e)
        return conn
    
    @app.route('/books', methods=['GET','POST'])
    def books():
        conn = db_connection()
        cursor = conn.cursor()
    
        if request.method == 'GET':
            cursor = conn.execute("SELECT * FROM books")
            books = [
                dict(id=row[0],author=row[1], title=row[2])
                for row in cursor.fetchall()
            ]
            if books is not None:
                return jsonify(books)
    
        if request.method == 'POST':
            new_author = request.form['author']
            new_title = request.form['title']
            sql = """
                    INSERT INTO books (author,title) VALUES (?,?)
            """
            cursor = cursor.execute(sql, (new_author,new_title))
            conn.commit()
    
            return f'Book with the id: {cursor.lastrowid} created successfully',201
    

    Archivo db.py

    import sqlite3
    
    conn = sqlite3.connect("books.sqlite")
    
    cursor = conn.cursor()
    
    sql_query = """
        CREATE TABLE books (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            author varchar(255) NOT NULL,
            title varchar(255) NOT NULL
        )
    """
    
    cursor.execute(sql_query)
    

    De esta manera, cada vez que se inserte un nuevo registro, la columna id se generará automáticamente e incrementará en SQLite, y se devolverá como parte de la respuesta JSON.

Comments are closed.