sqlite3.EperationalError: token no reconocido: “01T00” marca de datos de Python

Estoy experimentando un problema al insertar valores en una base de datos SQLite. Los datos que descargo del sitio del Parlamento noruego data.stortinget.no. El error que recibo es: sqlite3.EperationalError: token no reconocido: “01T00”

Aquí está el método en el que se produce el error: (Sé sobre el error de sangrado en este extracto)

def get_perioder(cur): DOK = "stortingsperioder" try: page = urllib2.urlopen(SITE+DOK) except: print "Failed to fetch item "+DOK if page: tree = ElementTree.parse(page) root = tree.getroot() top = list(root)[2] elements = list(top) for el in elements: fra = el.find('{http://data.stortinget.no}fra').text per_id = el.find('{http://data.stortinget.no}id').text til = el.find('{http://data.stortinget.no}til').text print "id: %s fra: %s til: %s" % (per_id, fra, til) cur.execute("INSERT INTO perioder(fra, id, til) VALUES(%s,%s,%s)" % (fra, per_id, til)) else: print "Could not load page: "+DOK 

El mensaje impreso por la impresión justo arriba de cur.execute es: id: 2009-2013 fra: 2009-10-01T00: 00: 00 hasta: 2013-09-30T23: 59: 59 Todo el seguimiento del error es:

 BigMac:Stortingsdata ola$ python getBasicData.py id: 2009-2013 fra: 2009-10-01T00:00:00 til: 2013-09-30T23:59:59 Traceback (most recent call last): File "getBasicData.py", line 169, in  get_perioder(cur) File "getBasicData.py", line 26, in get_perioder cur.execute("INSERT INTO perioder(fra, id, til) VALUES(%s,%s,%s)" % (fra, per_id, til)) sqlite3.OperationalError: unrecognized token: "01T00" 

Me referí con el manual de SQLite y parece que el formato es compatible, así que me pregunto de dónde viene el problema.

La forma correcta es utilizar una consulta parametrizada.
Ejemplo:

 cur.execute("""INSERT INTO perioder(fra, id, til) VALUES (?,?,?);""", (fra, per_id, til)) 

Hay un parámetro específico “estilo” para cada controlador de base de datos.
En el caso de SQLite ese estilo de parámetro es ? .

También tenga en cuenta que los valores de los parámetros se pasan como un segundo argumento para execute() .
El uso de la interpolación de cadenas lo deja vulnerable a todo tipo de problemas de cotización (como el que lo trajo aquí) y la posibilidad de un ataque de inyección SQL.

Para obtener más información, lea el DB-API y la wiki de progtwigción de bases de datos .