Parámetro no admitido al insertar int

3 minutos de lectura

Avatar de usuario de Tim McDonald
tim mcdonald

Intento almacenar la fecha y la hora en SQLite3 con la intención de recuperar los registros mediante comparaciones más adelante, por ejemplo. SELECT * WHERE date1 < date2. Dejé de intentar almacenar datetime.datetime objects y decidí usar una marca de tiempo UNIX en su lugar, ya que son solo un int pero sigo recibiendo errores.

import sqlite3 as lite
import datetime
import time

conn = lite.connect('dispatcher.db')
cur = conn.cursor()
query = "create table if not exists new_test (curent_dt)"
cur.execute(query)
conn.commit()
now = datetime.datetime.now() - datetime.timedelta(minutes=60)
temp = int(time.mktime(now.timetuple()))
cur.execute('insert into new_test (curent_dt) values (? )', (temp))
conn.commit()
conn.close()

Devuelve error:

cur.execute(‘insert into new_test (curent_dt) valores (? )’, (temp)) ValueError: los parámetros son de tipo no compatible

  • Posible duplicado de la regla de sintaxis de coma final de la tupla de Python

    – Ciro Santilli OurBigBook.com

    24 de noviembre de 2015 a las 9:31

  • @CiroSantilli六四事件法轮功包卓轩 Aunque esta es la respuesta a la pregunta, no veo la duplicación. ¡Misma solución! = misma pregunta.

    – Markus W. Mahlberg

    24 de noviembre de 2015 a las 12:18

  • @MarkusWMahlberg Creo que en este tipo de casos es mejor engañar. De lo contrario, podríamos hacer un número infinito de preguntas, una para cada API que espera una tupla, y generar un número infinito de preguntas. Aunque no es gran cosa, por supuesto 😉

    – Ciro Santilli OurBigBook.com

    24 de noviembre de 2015 a las 12:25


Avatar de usuario de Alex Flint
alex pedernal

Tenga en cuenta la coma añadida después de “temp” a continuación:

cur.execute('insert into new_test (curent_dt) values (?)', (temp,))

La razón por la que esto sucede es que (temp) es un numero entero pero (temp,) es una tupla de longitud uno que contiene temp.

  • los parámetros son de tipo no admitido significa como ejemplo que pasó un número entero a la consulta sql (que es una cadena) como dijo el usuario 2605884, haciendo lo mismo que cuando intenta concatenar int y str. La omisión de la coma en los parámetros simplemente falla silenciosamente. Es cierto que sin la coma (,) en los parámetros no funcionará, pero realmente no es la respuesta. Por favor, alguien verifique eso dos veces porque creo que esta respuesta es incorrecta y la gente simplemente la vota leyendo, no probando.

    – m3nda

    29/10/2015 a las 16:14


  • solo puede especificar una lista cur.execute('insert into table (column) values (?)', [temp])eso también funciona y es más legible en mi opinión

    – wesinat0r

    6 de julio de 2020 a las 15:01


avatar de usuario de lukekrrish
lukekrrish

tu código con error:

temp = int(time.mktime(now.timetuple()))
cur.execute('insert into new_test (curent_dt) values (? )', temp)

su código sin error:

temp = [(int(time.mktime(now.timetuple())))]
cur.execute('insert into new_test (curent_dt) values (? )', temp)

mi código cuando me dio el error:

all_stats_changed = change_health, change_damage, change_defense, change_cooldown

c.executemany("INSERT INTO player_stats VALUES (?, ?, ?, ?)", all_stats_changed)

mi código cuando funciona:

all_stats_changed = [(change_health, change_damage, change_defense, change_cooldown)]

c.executemany("INSERT INTO player_stats VALUES (?, ?, ?, ?)", all_stats_changed)

Básicamente, poner el código en un [()] resuelve el problema.

cambiando esa linea por esta

cur.execute('insert into new_test (curent_dt) values (?)',str(temp))

  • Debe haber algún razonamiento o explicación proporcionada.

    – Greg Hilton

    19/08/2017 a las 21:20

  • Esto puede quemarlo porque tratará la cadena como una tupla de caracteres y alimentará tantos parámetros de un solo carácter como la longitud de la cadena.

    – amonroejj

    2 de mayo de 2018 a las 3:08

¿Ha sido útil esta solución?