Liste der Tabellen, des Datenbankschemas, des Speicherauszugs usw. mithilfe der Python-SQLite3-API


150

Aus irgendeinem Grund kann ich keine Möglichkeit finden, die Entsprechungen der interaktiven Shell-Befehle von sqlite zu erhalten:

.tables
.dump

Verwenden der Python sqlite3-API.

Gibt es so etwas?


1
Ich schlage vor, die Frage in etwas umzubenennen, das nicht Python-spezifisch ist, da die Antwort für Schnittstellen, die SQL verwenden, eigentlich universell ist.
Unode

2
Stimmt, obwohl ich auf Nachfrage eine Python-API erwartet hatte. Ich werde versuchen, den richtigen Namen zu finden.
Noamtm

3
Wenn Sie Tabellen an der Eingabeaufforderung von sqlite3 anzeigen möchten, lesen Sie stackoverflow.com/questions/82875/… . Wenn Sie das Python-Paket sqlite3 verwenden, lesen Sie hier die Antwort von Davoud Taghawi-Nejad. Ich schlage vor, dass das OP Python wieder in den Fragentitel einfügt und Davouds Antwort auswählt. Ich habe diese Seite gefunden, indem ich "show tables Python sqlite3" gegoogelt habe, da Google den alten Fragentitel kennt. Suchen innerhalb von SO würden hier nicht landen. Ohne den Python-Winkel hat die verknüpfte doppelte Frage 82875 weitaus mehr Weisheit erhalten.
Bennett Brown

Antworten:


106

Sie können die Liste der Tabellen und Schemata abrufen, indem Sie die Tabelle SQLITE_MASTER abfragen:

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 jobungültige Syntax in Python ... was fehlt mir?
jbuddy_13

1
@ jbuddy_13 siehe die andere Antwort
Pro Q

1
@ jbuddy_13 sqlite>ist die SQLite-Befehlszeilen-Client-Eingabeaufforderung. Der Zweck des Beispiels war es zu demonstrieren, wie man die Datenbank abfragen kann, um Tabellen und Schemas aufzulisten.
converter42

244

In Python:

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

Achten Sie auf meine andere Antwort . Es gibt einen viel schnelleren Weg mit Pandas.


13
Für Benutzer, die zum Kopieren / Einfügen kommen: cursor.close()db.close()
Achten

1
Dies scheint die richtige Antwort zu sein, doch das OP genehmigte eine andere ...
a_a_a

3
@a_a_a Umm 4 Jahre Unterschied?
Mooncrater

72

Der SCHNELLSTE Weg, dies in Python zu tun, ist die Verwendung von Pandas (Version 0.16 und höher).

Werfen Sie einen Tisch weg:

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

Alle Tabellen löschen:

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
Für Benutzer, die zum Kopieren / Einfügen kommen: Achten Sie auf cursor.close()und db.close().
T. Woody

2
oder besser nutzenwith sqlite3.connect('database.db') as db:
frans

23

Ich bin nicht mit der Python-API vertraut, aber Sie können sie immer verwenden

SELECT * FROM sqlite_master;

20

Hier ist ein kurzes und einfaches Python-Programm zum Ausdrucken der Tabellennamen und Spaltennamen für diese Tabellen (Python 2. Python 3 folgt).

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."

(BEARBEITEN: Ich habe regelmäßig Abstimmungen dazu erhalten, daher hier die Python3-Version für Leute, die diese Antwort finden.)

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

Anscheinend hat die in Python 2.6 enthaltene Version von sqlite3 diese Fähigkeit: 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
Seien Sie vorsichtig damit, es werden alle Daten in Ihren Tabellen gedruckt, wenn sie mit INSERT INTO-Anweisungen gefüllt sind!
RobinL

4

Nach langem Hin und Her fand ich bei sqlite docs eine bessere Antwort, um die Metadaten für die Tabelle aufzulisten, sogar angehängte Datenbanken.

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

Die Schlüsselinformationen sind das Präfix table_info und nicht my_table mit dem Namen des Anhangshandles.


Ich habe viele Fehler in dem von Ihnen geschriebenen Snippet erhalten und sehe weder "db_alias" in den referenzierten Dokumenten noch in anderen Beispielen. Im Zusammenhang mit den anderen Beispielen denke ich, dass Sie diese Zeile wollen, zum Beispiel die JobTabelle: meta = cursor.execute("PRAGMA table_info('Job')") Und Ihre erste Zeile scheint nichts mit dem Rest zu tun zu haben.
Nealmcb

4

Wenn jemand dasselbe mit Pandas machen will

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 und Pandas müssen diese Frage nicht beantworten
woggioni

Keine Notwendigkeit, eine so nützliche Antwort zu knallen. Obwohl wie üblich ein Kontextmanager empfohlen wird.
user66081

Ich finde das die sauberste und nützlichste Antwort.
NL23codes

2

Überprüfen Sie hier für Dump. Es scheint, dass es in der Bibliothek sqlite3 eine Dump-Funktion gibt.


Ich versuche: importiere sqlite3 con = sqlite3.connect ("test.db") con.dump () Es schlägt fehl ... Ich überprüfe weiter
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"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.