Question or problem about Python programming:
For some reason I can’t find a way to get the equivalents of sqlite’s interactive shell commands:
.tables .dump
using the Python sqlite3 API.
Is there anything like that?
How to solve the problem:
Solution 1:
You can fetch the list of tables and schemata by querying the SQLITE_MASTER table:
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 )
Solution 2:
In Python:
con = sqlite3.connect('database.db') cursor = con.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") print(cursor.fetchall())
Watch out for my other answer. There is a much faster way using pandas.
Solution 3:
The FASTEST way of doing this in python is using Pandas (version 0.16 and up).
Dump one 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')
Dump all 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()
Solution 4:
I’m not familiar with the Python API but you can always use
SELECT * FROM sqlite_master;
Solution 5:
Here’s a short and simple python program to print out the table names and the column names for those tables (python 2. python 3 follows).
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: I have been getting periodic vote-ups on this, so here is the python3 version for people who are finding this answer)
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.")