2010-11-10 13 views
5

Cuando uso:simple cuestión sqlite

for i in Selection: 
    Q = "SELECT columnA FROM DB WHERE wbcode='"+i+"' and commodity='1'" 
    cursor.execute(Q) 
    ydata[i] = cursor.fetchall() 

me sale:

ydata = {'GBR': [(u'695022',), (u'774291',), (u'791499',)... ]} 

¿Cómo puedo cambiar mi código para obtener:

ydata = {'GBR': [695022, 774291, 791499,...]} 

Muchas gracias. obs: este es solo un ejemplo simplificado. trate de abstenerse de hacer recomendaciones sobre la inyección de sql.

+4

+1 para "intentar abstenerse de hacer recomendaciones sobre la inyección de sql" :) – Andomar

+0

No solo permite la inyección (si 'Selection' proviene de la entrada del usuario), sino que también afecta el almacenamiento en caché de sentencias. De hecho, hacerlo de la manera correcta no es más complicado, por lo que simplemente no hay justificación para construir manualmente sus declaraciones SQL. – adw

Respuesta

4
[int(x[0]) for x in cursor.fetchall()] 
+0

Gracias, funcionó. – relima

+0

A veces obtengo: ValueError: literal no válido para int(): NULL; ¿Tendría alguna sugerencia para arreglar esto? – relima

+0

Agregue a la consulta: 'y columnA no es nulo' –

2

En función de esta y de otra pregunta suya, debe comprender la afinidad de SQLite y la forma en que está rellenando la base de datos. Otras bases de datos requieren que los valores almacenados en una columna sean del mismo tipo, por ejemplo, todas las cadenas o todos los enteros. SQLite le permite almacenar cualquier cosa para que el tipo en cada fila sea diferente.

Para una primera aproximación, si inserta una cadena para esa fila, obtendrá una cadena, pondrá un número entero y obtendrá un número entero. En su caso, usted está obteniendo cadenas porque pone cadenas en lugar de números enteros.

Sin embargo, puede declarar una afinidad de columna y SQLite intentará convertir cuando inserte datos. Por ejemplo, si una columna tiene afinidad entera, si lo que inserta se puede convertir de forma segura/correcta a un entero, SQLite lo hará, por lo que la cadena "1" se almacenará como el entero 1 mientras que "1 1" se almacenará como la cadena "1 1".

Lea esta página para comprender los detalles. Encontrará las cosas mucho más fáciles de obtener datos si lo coloca utilizando los tipos correctos.

http://www.sqlite.org/datatype3.html

Si va a importar datos CSV a continuación, iniciar la cáscara APSW y el uso de "importar .help" para obtener algunas sugerencias sobre cómo hacer frente a esto.

+0

Excelente. Muchas gracias. – relima