Liste des tables, schéma de base de données, vidage, etc. utilisant l'API Python sqlite3


150

Pour une raison quelconque, je ne trouve pas de moyen d'obtenir les équivalents des commandes shell interactives de sqlite:

.tables
.dump

à l'aide de l'API Python sqlite3.

Y a-t-il quelque chose comme ça?


1
Je suggère de renommer la question en quelque chose de non spécifique à Python, car la réponse est en fait universelle pour les interfaces qui utilisent SQL.
unode

2
C'est vrai, même si je m'attendais à une API python en le posant. J'essaierai de trouver le bon nom.
noamtm

3
Si vous souhaitez afficher des tables à partir de l'invite de commande sqlite3, reportez-vous à stackoverflow.com/questions/82875/… . Si vous utilisez le package Python sqlite3, consultez la réponse de Davoud Taghawi-Nejad ici. Je suggère à l'OP d'ajouter Python dans le titre de la question et de sélectionner la réponse de Davoud. J'ai trouvé cette page en googlant "afficher les tables Python sqlite3" puisque Google connaît l'ancien titre de la question. Les recherches au sein de SO échoueraient ici. Sans l'angle Python, la question en double liée 82875 a reçu beaucoup plus de sagesse de la part de la foule.
Bennett Brown

Réponses:


106

Vous pouvez récupérer la liste des tables et des schémas en interrogeant la table 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 jobsyntaxe invalide en python ... que me manque-t-il?
jbuddy_13

1
@ jbuddy_13 voir l' autre réponse
Pro Q

1
@ jbuddy_13 sqlite>est l'invite du client de ligne de commande sqlite. Le but de l'exemple était de montrer comment on pouvait interroger la base de données pour lister les tables et le schéma.
convertisseur42

245

En Python:

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

Attention à mon autre réponse . Il existe un moyen beaucoup plus rapide d'utiliser les pandas.


13
Pour les utilisateurs venant copier / coller: Assurez-vous de cursor.close()etdb.close()
T.Woody

1
Cela semble être la bonne réponse, mais le PO en a approuvé une autre ...
a_a_a

3
@a_a_a Umm différence de 4 ans?
Mooncrater le

72

La façon la plus rapide de faire cela en python utilise Pandas (version 0.16 et plus).

Videz une table:

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

Videz toutes les tables:

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
Pour les utilisateurs venant copier / coller: assurez-vous que cursor.close()et db.close().
T.Woody

2
ou meilleure utilisationwith sqlite3.connect('database.db') as db:
frans

23

Je ne connais pas l'API Python mais vous pouvez toujours utiliser

SELECT * FROM sqlite_master;

20

Voici un programme python court et simple pour imprimer les noms de table et les noms de colonne de ces tables (python 2. python 3 suit).

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: J'ai reçu des votes périodiques à ce sujet, voici donc la version python3 pour les personnes qui trouvent cette réponse)

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

Apparemment, la version de sqlite3 incluse dans Python 2.6 a cette 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
Soyez prudent avec cela, il imprimera toutes les données de vos tables si elles sont remplies avec des instructions INSERT INTO!
RobinL

4

Après beaucoup de bidouillage, j'ai trouvé une meilleure réponse sur sqlite docs pour lister les métadonnées de la table, même les bases de données attachées.

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

Les informations clés sont de préfixer table_info, et non ma_table avec le nom du descripteur de pièce jointe.


J'ai eu beaucoup d'erreurs dans l'extrait que vous avez écrit, et je ne vois pas par exemple "db_alias" dans les documents référencés ou dans d'autres exemples. Dans le contexte des autres exemples, je pense que vous voulez cette ligne, par exemple le Jobtableau: meta = cursor.execute("PRAGMA table_info('Job')") Et votre première ligne semble sans rapport avec le reste.
nealmcb

4

Si quelqu'un veut faire la même chose avec les 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 et Pandas ne sont pas tenus de répondre à cette question
woggioni

Inutile de claquer une réponse aussi utile. Bien que, comme d'habitude, un gestionnaire de contexte soit recommandé.
user66081

Je trouve que c'est la réponse la plus claire et la plus utile.
NL23codes le

2

Vérifiez ici pour le vidage. Il semble qu'il existe une fonction de vidage dans la bibliothèque sqlite3.


J'essaye: import sqlite3 con = sqlite3.connect ("test.db") con.dump () Cela échoue ... Je continue à vérifier
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"

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.