这是我写的一个使用 pysqlite2 写的数据库备份的小程序,功能相对简单。它可以将指定的库备份成Insert语句。代码如下:
#coding=cp936
#本程序用于sqlite数据库的备份,备份结果为SQL的INSERT语句
#本程序适用于pysqlite2版本
#开发者:limodou
#版权:GPL
#
import sqlite3 as sqlite
import os.path
def dbbackup(dbname, path='', singlefile=False, encoding='utf-8'):
"""备份整个数据库
dbname 数据库文件名
path 数据保存目录
singlefile 是否保存到单个文件,如果为True,则数据会保存在以dbname开头的.txt文件中
否则会按表名分别存储
encoding 保存文件编码
"""
cx = sqlite.connect(dbname)
cu = cx.cursor()
cu.execute(u'select name from sqlite_master where type="table" order by name')
if singlefile:
filename = os.path.join(path, os.path.basename(dbname) + '.txt')
f = file(filename, 'wb')
for (table,) in cu.fetchall():
if not singlefile:
filename = os.path.join(path, table + '.txt')
f = file(filename, 'wb')
unload(cu, table, f, encoding)
if not singlefile:
f.close()
def unload(cu, tablename, fp, encoding='utf-8'):
cu.execute('select * from %s' % tablename)
if cu.description:
description = cu.description
sql = 'INSERT INTO %s ' % tablename
columns = []
for v in description:
columns.append(v[0])
sql += '(' + ','.join(columns) +' ) VALUES '
fp.write("BEGIN TRANSACTION;\n")
for record in cu.fetchall():
fsql = sql.encode(encoding) + '('+ ','.join(_repr(record, encoding)) +' );\n'
fp.write(fsql)
fp.write("COMMIT;\n")
def _repr(record, encoding='utf-8'):
s = []
for i in record:
if isinstance(i, str):
s.append("'" + i + "'")
elif isinstance(i, unicode):
s.append("'" + i.encode(encoding) + "'")
else:
s.append(str(i))
return s
if __name__ == '__main__':
dbbackup('DLib.db', 'g:')
# dbbackup(‘d:/test.db’, ‘d:/project’, singlefile=True, encoding=’cp936′)
只要你自已建一个库,然后按测试代码改一下试试就行了。
如果想使用 Python 来装入数据,可以:
cu.executescript(file('g:/DataRecord.txt').read())
cx.commit()
其中DataRecord.txt为备份出的文件。大家有兴趣可以试试。
当然这些工作使用sqlite的客户端都是可以做的,但有时还是希望在程序中来控制一切。
from:http://blog.donews.com/limodou/archive/2005/06/14/430149.aspx