Elenco di tabelle, schema db, dump ecc. Utilizzando l'API sqlite3 di Python


150

Per qualche motivo non riesco a trovare un modo per ottenere gli equivalenti dei comandi interattivi della shell di sqlite:

.tables
.dump

usando l'API sqlite3 di Python.

C'è qualcosa del genere?


1
Suggerisco di rinominare la domanda con qualcosa di non specifico per Python poiché la risposta è in realtà universale per le interfacce che usano SQL.
unode l'

2
È vero, anche se mi aspettavo un'API Python quando lo chiedevo. Proverò a trovare il nome giusto.
noamtm,

3
Se volendo mostrare le tabelle dal comando sqlite3 pronta, fare riferimento a stackoverflow.com/questions/82875/... . Se si utilizza il pacchetto Python sqlite3, vedere la risposta di Davoud Taghawi-Nejad qui. Suggerisco all'OP di aggiungere Python al titolo della domanda e selezionare la risposta di Davoud. Ho trovato questa pagina su Google "mostra tabelle Python sqlite3" poiché Google conosce il vecchio titolo della domanda. Le ricerche all'interno di SO non riuscirebbero ad atterrare qui. Senza l'angolo di Python, la domanda duplicata collegata 82875 ha ricevuto molta più saggezza della folla.
Bennett Brown,

Risposte:


106

È possibile recuperare l'elenco di tabelle e schemi eseguendo una query sulla tabella 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 jobsintassi non valida in Python ... cosa mi sto perdendo?
jbuddy_13,

1
@ jbuddy_13 vedi l' altra risposta
Pro Q

1
@ jbuddy_13 sqlite>è il prompt del client della riga di comando di sqlite. Lo scopo dell'esempio era dimostrare come si potesse interrogare il database per elencare tabelle e schemi.
converter42

245

In Python:

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

Fai attenzione alla mia altra risposta . C'è un modo molto più veloce usando i panda.


13
Per gli utenti che vengono a copia / incolla: Assicurarsi di cursor.close()edb.close()
T.Woody

1
Questa sembra essere la risposta corretta, ma l'OP ne ha approvato un altro ...
a_a_a

3
@a_a_a Umm differenza di 4 anni?
Mooncrater,

72

Il modo più veloce per farlo in Python sta usando Pandas (versione 0.16 e successive).

Scarica una tabella:

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

Scarica tutti i tavoli:

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
Per gli utenti che vengono a copiare / incollare: assicurati di cursor.close()e db.close().
T.Woody,

2
o meglio usarewith sqlite3.connect('database.db') as db:
frans

23

Non ho familiarità con l'API Python ma puoi sempre usarla

SELECT * FROM sqlite_master;

20

Ecco un breve e semplice programma Python per stampare i nomi delle tabelle e i nomi delle colonne per quelle tabelle (segue Python 2. 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."

(EDIT: ho ricevuto periodici voti su questo, quindi ecco la versione di python3 per le persone che stanno trovando questa risposta)

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

Apparentemente la versione di sqlite3 inclusa in Python 2.6 ha questa capacità: 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
Fai attenzione a questo, stamperà tutti i dati nelle tue tabelle se sono popolati con le istruzioni INSERT INTO!
RobinL

4

Dopo un sacco di armeggi ho trovato una risposta migliore ai documenti sqlite per elencare i metadati per la tabella, anche i database collegati.

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

Le informazioni chiave sono il prefisso table_info, non my_table con il nome dell'handle dell'allegato.


Ho riscontrato molti errori nello snippet che hai scritto e non vedo, ad esempio, "db_alias" nei documenti di riferimento o in altri esempi. Nel contesto degli altri esempi, penso che tu voglia questa riga, ad esempio la Jobtabella: meta = cursor.execute("PRAGMA table_info('Job')") e la tua prima riga sembra non correlata al resto.
nealmcb,

4

Se qualcuno vuole fare la stessa cosa con i panda

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 e Panda non sono tenuti a rispondere a questa domanda
woggioni,

Non c'è bisogno di sbattere una risposta così utile. Sebbene, come al solito, si consiglia un gestore di contesto.
user66081

Trovo che questa sia la risposta più pulita e utile.
NL23 codifica il

2

Dai un'occhiata qui per il dump. Sembra che ci sia una funzione di dump nella libreria sqlite3.


Sto provando: import sqlite3 con = sqlite3.connect ("test.db") con.dump () Non riesce ... Continuo a controllare
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"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.