Cuando usas:

import datetime
import sqlite3

db = sqlite3.connect('mydb.sqlite', detect_types=sqlite3.PARSE_DECLTYPES)
c = db.cursor()
db.text_factory = str

c.execute('create table if not exists mytable (date timestamp, title str, \
    custom str, x float, y float, z char default null, \
    postdate timestamp default null, id integer primary key autoincrement, \
    url text default null)')
c.execute('insert into mytable values(?, ?, ?, ?, ?)', \
    (datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))

Tengo:

sqlite3.OperationalError: la tabla mytable tiene 9 columnas pero se proporcionaron 5 valores

¿Por qué SQlite no toma en consideración los valores predeterminados (especificados durante la creación de la tabla) para completar una nueva fila?

(Además, cuando estoy reabriendo un proyecto que escribí hace unos años, ya no encuentro los tipos de datos str, char en el documento sqlite3, ¿sigue siendo relevante?)

2
Basj 24 feb. 2018 a las 03:27

3 respuestas

La mejor respuesta

Porque está diciendo que desea insertar todas las columnas sin especificar las columnas específicas.

Cambiar 'insert into mytable values(?, ?, ?, ?, ?)'

A 'insert into mytable (date, title, custom, x, y) values(?, ?, ?, ?, ?)'

Prácticamente se puede especificar cualquier valor para el tipo de columna, el valor seguirá un conjunto de reglas y se convertirá a TEXT, INTEGER, REAL, NUMERIC o BLOB. Sin embargo, puede almacenar cualquier tipo de valor en cualquier columna.

  • STR resolverá a NUMÉRICA,
  • TIMESTAMP se resolverá a NUMÉRICA,
  • FLOAT se resolverá en REAL,
  • CHAR al TEXTO.

Lea Tipos de datos en SQLite o quizás eche un vistazo a ¿Qué tan flexibles / restrictivos son los tipos de columnas SQLite?

3
Basj 25 feb. 2018 a las 10:25

Solución de ejemplo

cursor.execute('CREATE TABLE vehicles_record (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)')

Consulta SQLite3 arriba

cursor.execute("INSERT INTO vehicles_record(name) VALUES(?)", (name))

Resultado

id sería 1, nombre sería valor de nombre var, marca de tiempo actual para la última columna.

0
Mujeeb Ishaque 5 mar. 2019 a las 18:00

Si solo va a suministrar valores para algunas columnas, debe especificar qué columnas. De lo contrario, el motor no sabrá dónde colocarlos. Esta línea necesita ser cambiada:

c.execute('insert into mytable values(?, ?, ?, ?, ?)', \
(datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))

A esto:

c.execute('insert into mytable (date, title, custom, x, y)values(?, ?, ?, ?, ?)', \
(datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))
2
mypetlion 24 feb. 2018 a las 00:40