使用Python sqlite3 API的表,数据库模式,转储等列表

出于某种原因,我找不到一种方法来获得sqlite的交互式shell命令的等价物:

.tables .dump 

使用Python的sqlite3 API。

有没有这样的事情?

您可以通过查询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 ) 

在Python中:

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

注意我的其他答案 。 用pandas有更快的方法。

在python中做到这一点的最快方法是使用pandas(版本0.16及以上)。

转储一个表格:

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

转储所有表格:

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

显然,Python 2.6中包含的sqlite3版本具有以下function: 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) 

我不熟悉Python API,但可以随时使用

 SELECT * FROM sqlite_master; 

看看这里转储。 看来在库sqlite3中有一个转储function。

经过大量的摆弄之后,我在sqlite文档中发现了一个更好的答案,可以列出表格的元数据,甚至附加的数据库。

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

关键信息是以附件句柄名称作为前缀table_info,而不是my_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" 

我已经在PHP中实现了一个sqlite表模式parsing器,你可以在这里检查: https : //github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php

您可以使用此定义parsing器来parsing下面的代码的定义:

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

这里有一个简短的python程序来打印这些表的表名和列名。

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