db = sqlite.connect("test.sqlite")
res = db.execute("select * from table")
Con la iteración, obtengo listas que corresponden a las filas.
for row in res:
print row
Puedo obtener el nombre de las columnas
col_name_list = [tuple[0] for tuple in res.description]
Pero, ¿hay alguna función o configuración para obtener diccionarios en lugar de listas?
{'col1': 'value', 'col2': 'value'}
o tengo que hacerlo yo mismo?
python
sql
sqlite
dictionary
dataformat
Meloun
fuente
fuente
Respuestas:
Puede usar row_factory , como en el ejemplo de los documentos:
o siga los consejos que se dan justo después de este ejemplo en los documentos:
fuente
SELECT 1 AS "dog[cat]"
entoncescursor
no tendrán la descripción correcta para crear un diccionario.connection.row_factory = sqlite3.Row
e intentéconnection.row_factory = dict_factory
como se muestra, perocur.fetchall()
todavía me está dando una lista de tuplas, ¿alguna idea de por qué esto no funciona?collections.namedtuple
. Cuando lo usocur.fetchmany()
, obtengo entradas como<sqlite3.Row object at 0x...>
.Pensé que respondía a esta pregunta a pesar de que la respuesta se menciona en parte en las respuestas de Adam Schmideg y Alex Martelli. Para que otros como yo que tienen la misma pregunta, encuentren la respuesta fácilmente.
fuente
fetchall()
parece devolversqlite3.Row
objetos. Sin embargo, estos pueden ser convertidos en un diccionario simplemente usandodict()
:result = [dict(row) for row in c.fetchall()]
.Incluso usando la clase sqlite3.Row, todavía no puede usar el formato de cadena en forma de:
Para superar esto, utilizo una función auxiliar que toma la fila y la convierte en un diccionario. Solo uso esto cuando el objeto del diccionario es preferible al objeto Fila (por ejemplo, para cosas como el formato de cadena donde el objeto Fila no es compatible de forma nativa con la API del diccionario). Pero use el objeto Row el resto de veces.
fuente
print "%(id)i - %(name)s: %(value)s" % dict(row)
Después de conectarse a SQLite:
con = sqlite3.connect(.....)
basta con ejecutar:¡Voila!
fuente
Desde PEP 249 :
Así que sí, hazlo tú mismo.
fuente
Versión más corta:
fuente
Más rápido en mis pruebas:
vs:
Tú decides :)
fuente
Soluciones similares a las mencionadas anteriormente, pero más compactas:
fuente
db.row_factory = sqlite3.Row
no funcionaron para mí (ya que resultó en un JSON TypeError)Como se menciona en la respuesta de @gandalf, uno tiene que usar
conn.row_factory = sqlite3.Row
, pero los resultados no son directamente diccionarios. Uno tiene que agregar un "elenco" adicionaldict
en el último bucle:fuente
Creo que estabas en el camino correcto. Mantengamos esto muy simple y completemos lo que estaba tratando de hacer:
La desventaja es que
.fetchall()
, que es un asesinato en el consumo de memoria , si su mesa es muy grande. Pero para aplicaciones triviales que se ocupan de unos pocos miles de filas de texto y columnas numéricas, este enfoque simple es suficientemente bueno.Para cosas serias, debe buscar en las fábricas de filas, como se propone en muchas otras respuestas.
fuente
O puede convertir sqlite3.Rows en un diccionario de la siguiente manera. Esto le dará un diccionario con una lista para cada fila.
fuente
Una alternativa genérica, usando solo tres líneas
Pero si su consulta no devuelve nada, resultará en un error. En este caso...
o
fuente
El resultado es definitivamente cierto, pero no sé cuál es el mejor.
fuente
Los diccionarios en Python proporcionan acceso arbitrario a sus elementos. Por lo tanto, cualquier diccionario con "nombres", aunque podría ser informativo por un lado (también conocido como los nombres de los campos) "desordena" los campos, lo que podría no ser deseado.
El mejor enfoque es obtener los nombres en una lista separada y luego combinarlos con los resultados usted mismo, si es necesario.
También recuerde que los nombres, en todos los enfoques, son los nombres que proporcionó en la consulta, no los nombres en la base de datos. La excepción es la
SELECT * FROM
Si su única preocupación es obtener los resultados usando un diccionario, definitivamente use el
conn.row_factory = sqlite3.Row
(ya mencionado en otra respuesta).fuente