sqlalchemy.exc.OperationalError: Insert Into Values

Estoy usando Alembic con Python para hacer las migraciones de esquemas, crear las bases de datos, etc. También quiero añadir algunos datos a las columnas para testear la API in este punto del desarrollo.

Haciendo esto me encontré con un fallo tonto, de esos debidos a que hace mucho que no utilizas algo.

Añado la revisión de Alembic

alembic revision -m "create users table"

Añado la tabla y los comandos que necesito en el .py

"""create users table

Revision ID: 6510cd7cdb67
Revises: a8497865419b
Create Date: 2022-05-02 10:50:08.551532

"""
from alembic import op
import sqlalchemy as sa

from sqlalchemy import Column, String, Integer

# revision identifiers, used by Alembic.
revision = '6510cd7cdb67'
down_revision = 'a8497865419b'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table(
        'users',
        Column('user_id', Integer, primary_key=True, autoincrement=True),
        Column('user_name', String, unique=False, index=False),
        Column('user_password', String, nullable=False, unique=False, index=False),
        Column('token', String, nullable=False, unique=False, index=False),
        Column('user_location', String, nullable=False, unique=False, index=False),
        Column('bank_account', String, nullable=False, unique=False, index=False),
    )

        op.execute("INSERT INTO users VALUES ('rubendob','patatas','has123','barcelona', 'ES9121000418450200051331')")



def downgrade():
    pass

Ejecuto mi imagen de Docker que procesa la revisión. En este momento, ya veo el error y el Docker escapa. Vamos a ver por qué.

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 5 values for 6 columns
[SQL: INSERT INTO users (user_id, user_name, user_password, token, user_location, bank_account) VALUES ('rubendob','patatas','has123', 'barcelona', 'ES9121000418450200051331')]
(Background on this error at: https://sqlalche.me/e/14/e3q8)

Si miramos en el método, op.create_table, hemos ejecutado el siguiente comando SQL

 op.execute("INSERT INTO users VALUES ('rubendob','patatas','has123','barcelona', 'ES9121000418450200051331')")

Yo tenía entendido que mágicamente, Sqlite añadiría los campos a la fila y el user_id sería incrementado automáticamente sin más pero, parece ser que no es la sentencia correcta.

El motivo del error es que la sentencia de SQL esperan que proporcione la misma cantidad de valores que columnas en la tabla cuando no se usa un especificador de columna.

Lo podemos solucionar con esta otra sentencia SQL

op.execute("INSERT INTO users (user_name, user_password, token, user_location, bank_account) VALUES ('rubendob','patatas','has123', 'barcelona', 'ES9121000418450200051331')")

La diferencia es que específicamos en users, todos los campos que necesitamos.

Leave a Reply

Your email address will not be published. Required fields are marked *