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.