2008-11-20 3 views
92

Aus irgendeinem Grunde, den ich nicht einen Weg finden, kann die Äquivalente von SQLite interaktiven Shell-Befehlen zu erhalten:Liste der Tabellen, Db-Schema, Dump etc des API sqlite3 Python

.tables 
.dump 

des API sqlite3 mit Python.

Gibt es so etwas?

+1

Ich empfehle die Umbenennung der Frage in etwas nicht pythonspezifisch, da die Antwort tatsächlich universell für Schnittstellen ist, die SQL verwenden. – Unode

+2

Wahr, obwohl ich eine Python-API erwartet habe, als ich danach gefragt habe. Ich werde versuchen, den richtigen Namen zu finden. – noamtm

+3

Wenn Sie Tabellen über die sqlite3-Eingabeaufforderung anzeigen möchten, lesen Sie http://stackoverflow.com/questions/82875/how-do-i-list-the-tables-in-a-sqlite-database-file. Wenn Sie das Python-Paket sqlite3 verwenden, lesen Sie Davoud Taghawi-Nejads Antwort hier.Ich schlage vor, dass das OP Python wieder in den Fragetitel einfügt und Davouds Antwort auswählt. Ich habe diese Seite gefunden, indem ich "Zeige Tabellen Python sqlite3" gegoogelt habe, da Google den alten Fragetitel kennt. Suchen innerhalb von SO würden hier nicht landen. Ohne den Python-Winkel hat die verknüpfte doppelte Frage 82875 weit mehr Crowd-Weisheit erhalten. –

Antwort

71

Sie können die Liste der Tabellen und Schemata durch Abfrage der SQLITE_MASTER Tabelle holen können:

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 
) 
17

Ich bin mit dem Python-API nicht vertraut, aber sie immer

SELECT * FROM sqlite_master; 
2

Check out here für Müllkippe. Es scheint, dass es eine Speicherfunktion in der Bibliothek sqlite3 gibt.

+0

Ich versuche: Import sqlite3 con = sqlite3.connect ("test.db") con.dump() Es scheitert ... ich – Angel

17

Offenbar ist die Version von sqlite3 in Python enthalten 2.6 hat 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

Ihre Tickets mit dieser Vorsicht, wird es drucken alle Daten in Ihren Tabellen, wenn sie mit INSERT INTO-Anweisungen gefüllt sind! – RobinL

148

In Python:

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

für meine anderen answer Watch out. Es gibt einen viel schnelleren Weg mit Pandas.

1

Nach viel Fiedeln fand ich eine bessere Antwort bei sqlite docs für die Auflistung der Metadaten für die Tabelle, sogar angefügten Datenbanken.

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

Die wichtigsten Informationen ist table_info Präfix, nicht mit dem Befestigungsbügel Namen my_table.

+0

Ich habe viele Fehler in dem Snippet, das Sie geschrieben haben, und sehe z. "db_alias" in den referenzierten Dokumenten oder in anderen Beispielen. Im Zusammenhang mit den anderen Beispielen denke ich, dass Sie diese Linie wünschen, z. die 'Job'-Tabelle:' meta = cursor.execute ("PRAGMA table_info ('Job')") 'Und deine erste Zeile scheint mit dem Rest nichts zu tun zu haben. – nealmcb

0

ich eine SQLite-Tabellenschema Parser in PHP implementiert haben, können Sie hier überprüfen: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php

Sie diese Definition-Parser verwenden, können die Definitionen wie dem folgenden Code zu analysieren:

$parser = new SqliteTableDefinitionParser; 
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)'); 
32

Die FASTEST Dies wird in Python mit Pandas (Version 0.16 und höher) gemacht.

Dump eine Tabelle:

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

Dump alle Tabellen:

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') 
1
#!/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" 
1

Hier ist ein kurzes und einfaches Python-Programm aus den Tabellennamen und die Spaltennamen für diese Tabellen zu drucken.

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