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