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
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
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
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