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?
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?
Antworten:
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
)
sqlite> .schema job
ungültige Syntax in Python ... was fehlt mir?
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.
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.
cursor.close()
db.close()
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()
cursor.close()
und db.close()
.
with sqlite3.connect('database.db') as db:
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.")
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)
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.
Job
Tabelle: meta = cursor.execute("PRAGMA table_info('Job')")
Und Ihre erste Zeile scheint nichts mit dem Rest zu tun zu haben.
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)
#!/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"
Ich habe einen SQLite-Tabellenschema-Parser in PHP implementiert. Sie können dies hier überprüfen: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php
Mit diesem Definitionsparser können Sie die Definitionen wie im folgenden Code analysieren:
$parser = new SqliteTableDefinitionParser;
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)');