日期:2014-05-16  浏览次数:20526 次

一个使用pysqlite2的数据库备份小程序

这是我写的一个使用 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