Lista de tablas, esquema de base de datos, volcado, etc. utilizando la API Python sqlite3


151

Por alguna razón, no puedo encontrar una manera de obtener los equivalentes de los comandos de shell interactivos de sqlite:

.tables
.dump

usando la API Python sqlite3.

¿Hay algo por el estilo?


1
Sugiero cambiar el nombre de la pregunta a algo que no sea específico de Python, ya que la respuesta es realmente universal para las interfaces que usan SQL.
Unode

2
Es cierto, aunque esperaba una API de Python cuando la preguntaba. Trataré de encontrar el nombre correcto.
noamtm

3
Si desea mostrar tablas desde el símbolo del sistema sqlite3, consulte stackoverflow.com/questions/82875/… . Si usa el paquete Python sqlite3, vea la respuesta de Davoud Taghawi-Nejad aquí. Sugiero que el OP agregue Python nuevamente en el título de la pregunta y seleccione la respuesta de Davoud. Encontré esta página buscando en Google "show tables Python sqlite3" ya que Google conoce el antiguo título de la pregunta. Las búsquedas dentro de SO no podrían aterrizar aquí. Sin el ángulo de Python, la pregunta duplicada vinculada 82875 ha recibido mucha más sabiduría de la multitud.
Bennett Brown, el

Respuestas:


106

Puede obtener la lista de tablas y esquemas consultando la tabla SQLITE_MASTER:

sqlite> .tab
job         snmptarget  t1          t2          t3        
sqlite> select name from sqlite_master where type = 'table';
job
t1
t2
snmptarget
t3

sqlite> .schema job
CREATE TABLE job (
    id INTEGER PRIMARY KEY,
    data VARCHAR
);
sqlite> select sql from sqlite_master where type = 'table' and name = 'job';
CREATE TABLE job (
    id INTEGER PRIMARY KEY,
    data VARCHAR
)

2
sqlite> .schema jobsintaxis no válida en python ... ¿qué me estoy perdiendo?
jbuddy_13

1
@ jbuddy_13 mira la otra respuesta
Pro Q

1
@ jbuddy_13 sqlite>es el indicador de cliente de línea de comando sqlite. El propósito del ejemplo era demostrar cómo se podía consultar la base de datos para enumerar tablas y esquemas.
convertidor42

245

En Python:

con = sqlite3.connect('database.db')
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
print(cursor.fetchall())

Cuidado con mi otra respuesta . Hay una forma mucho más rápida de usar pandas.


13
Para los usuarios que vienen a copiar / pegar: asegúrese de cursor.close()ydb.close()
T.Woody

1
Esta parece ser la respuesta correcta, pero el OP aprobó otra ...
a_a_a

3
@a_a_a Umm 4 años de diferencia?
Mooncrater

72

La forma MÁS RÁPIDA de hacer esto en Python es utilizando Pandas (versión 0.16 y posteriores).

Volcar una mesa:

db = sqlite3.connect('database.db')
table = pd.read_sql_query("SELECT * from table_name", db)
table.to_csv(table_name + '.csv', index_label='index')

Volcar todas las tablas:

import sqlite3
import pandas as pd


def to_csv():
    db = sqlite3.connect('database.db')
    cursor = db.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
    for table_name in tables:
        table_name = table_name[0]
        table = pd.read_sql_query("SELECT * from %s" % table_name, db)
        table.to_csv(table_name + '.csv', index_label='index')
    cursor.close()
    db.close()

3
Para usuarios que vienen a copiar / pegar: asegúrese de cursor.close()y db.close().
T.Woody

2
o mejor usowith sqlite3.connect('database.db') as db:
frans

23

No estoy familiarizado con la API de Python, pero siempre puedes usar

SELECT * FROM sqlite_master;

20

Aquí hay un programa de Python corto y simple para imprimir los nombres de las tablas y los nombres de las columnas para esas tablas (python 2. sigue python 3).

import sqlite3

db_filename = 'database.sqlite'
newline_indent = '\n   '

db=sqlite3.connect(db_filename)
db.text_factory = str
cur = db.cursor()

result = cur.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
table_names = sorted(zip(*result)[0])
print "\ntables are:"+newline_indent+newline_indent.join(table_names)

for table_name in table_names:
    result = cur.execute("PRAGMA table_info('%s')" % table_name).fetchall()
    column_names = zip(*result)[1]
    print ("\ncolumn names for %s:" % table_name)+newline_indent+(newline_indent.join(column_names))

db.close()
print "\nexiting."

(EDITAR: He estado recibiendo votaciones periódicas sobre esto, así que aquí está la versión de python3 para las personas que están encontrando esta respuesta)

import sqlite3

db_filename = 'database.sqlite'
newline_indent = '\n   '

db=sqlite3.connect(db_filename)
db.text_factory = str
cur = db.cursor()

result = cur.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
table_names = sorted(list(zip(*result))[0])
print ("\ntables are:"+newline_indent+newline_indent.join(table_names))

for table_name in table_names:
    result = cur.execute("PRAGMA table_info('%s')" % table_name).fetchall()
    column_names = list(zip(*result))[1]
    print (("\ncolumn names for %s:" % table_name)
           +newline_indent
           +(newline_indent.join(column_names)))

db.close()
print ("\nexiting.")

17

Aparentemente, la versión de sqlite3 incluida en Python 2.6 tiene esta capacidad: http://docs.python.org/dev/library/sqlite3.html

# Convert file existing_db.db to SQL dump file dump.sql
import sqlite3, os

con = sqlite3.connect('existing_db.db')
with open('dump.sql', 'w') as f:
    for line in con.iterdump():
        f.write('%s\n' % line)

1
¡Tenga cuidado con esto, imprimirá todos los datos en sus tablas si se completan con instrucciones INSERT INTO!
RobinL

4

Después de mucho juguetear, encontré una mejor respuesta en sqlite docs para enumerar los metadatos de la tabla, incluso las bases de datos adjuntas.

meta = cursor.execute("PRAGMA table_info('Job')")
for r in meta:
    print r

La información clave es prefijar table_info, no my_table con el nombre del identificador de archivo adjunto.


Recibí muchos errores en el fragmento que escribiste y no veo, por ejemplo, "db_alias" en los documentos a los que se hace referencia ni en otros ejemplos. En el contexto de los otros ejemplos, creo que desea esta línea, por ejemplo, la Jobtabla: meta = cursor.execute("PRAGMA table_info('Job')") Y su primera línea parece no estar relacionada con el resto.
nealmcb

4

Si alguien quiere hacer lo mismo con los pandas

import pandas as pd
import sqlite3
conn = sqlite3.connect("db.sqlite3")
table = pd.read_sql_query("SELECT name FROM sqlite_master WHERE type='table'", conn)
print(table)

1
Jupyter Notebook y Pandas no están obligados a responder esta pregunta
woggioni

No es necesario dar una respuesta tan útil. Aunque, como de costumbre, se recomienda un administrador de contexto.
user66081

Creo que esta es la respuesta más limpia y útil.
NL23codes

2

Echa un vistazo aquí para el volcado. Parece que hay una función de volcado en la biblioteca sqlite3.


Estoy intentando: import sqlite3 con = sqlite3.connect ("test.db") con.dump () Falla ... Sigo comprobando
Angel

2
#!/usr/bin/env python
# -*- coding: utf-8 -*-

if __name__ == "__main__":

   import sqlite3

   dbname = './db/database.db'
   try:
      print "INITILIZATION..."
      con = sqlite3.connect(dbname)
      cursor = con.cursor()
      cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
      tables = cursor.fetchall()
      for tbl in tables:
         print "\n########  "+tbl[0]+"  ########"
         cursor.execute("SELECT * FROM "+tbl[0]+";")
         rows = cursor.fetchall()
         for row in rows:
            print row
      print(cursor.fetchall())
   except KeyboardInterrupt:
      print "\nClean Exit By user"
   finally:
      print "\nFinally"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.