ITPub博客

首页 > Linux操作系统 > Linux操作系统 > trac 平台从 PG 数据库转到sqlite 的脚本。

trac 平台从 PG 数据库转到sqlite 的脚本。

原创 Linux操作系统 作者:babyyellow 时间:2013-03-28 17:39:18 0 删除 编辑

上一篇讲了sqlite 的数据字典

这里就把pg 写sqlite 的python 脚本贴出来给需要的朋友做个参考。


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os,sys
import psycopg2
import sqlite3 as sqllite




## init
connstring="host='x.x.x.x' dbname='trac_db' user='trac_user'"
rptlib_file=r'pg-sqlite.db'
transtfer_db_list={"trac_itmdb":("host='x.x.x.x' dbname='trac_db' user='trac_user'",r'itm_new.db'),
                
clean_table_set=('permission','auth_cookie','session','session_attribute','cache','attachment','repository','revision','node_change',
                 'ticket','ticket','ticket_change','ticket_custom','enum','component','milestone','version','report')

sql_set ={"permission":("""insert into permission (username,action) values(?,?)""",),
          "auth_cookie":("""insert into auth_cookie (cookie,name,ipnr,time) values(?,?,?,?)""",),
          "session":("""insert into session (sid,authenticated,last_visit) values(?,?,?)""",),
          "session_attribute":("""insert into session_attribute (sid,authenticated,name,value) values(?,?,?,?)""",),
          "cache":("""insert into cache (id,generation) values(?,?)""",),
          "attachment":("""insert into attachment (type,id,filename,size,time,description,author,ipnr) values(?,?,?,?,?,?,?,?)""",),
          "repository":("""insert into repository (id,name,value) values (?,?,?)""",),
          "revision":("""insert into revision (repos,rev,time,author,message) values(?,?,?,?,?)""",),
          "node_change":("""insert into node_change (repos,rev,path,node_type,change_type,base_path,base_rev) values (?,?,?,?,?,?,?)""",),
          "ticket":("""insert into ticket (id,type,time,changetime,component,severity,priority,owner,reporter,cc,version,
                 milestone,status,resolution,summary,description,keywords) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""",),
          "ticket_change":("""insert into ticket_change (ticket,time,author,field,oldvalue,newvalue) values (?,?,?,?,?,?)""",),
          "ticket_custom":("""insert into ticket_custom (ticket,name,value) values (?,?,?)""",),
          "enum":("""insert into enum (type,name,value) values (?,?,?)""",),
          "component":("""insert into component (name,owner,description) values (?,?,?)""",),
          "milestone":("""insert into milestone (name,due,completed,description) values (?,?,?,?)""",),
          "version":("""insert into version (name,time,description) values (?,?,?)""",),
          "report":("""insert into report (id,author,title,query,description) values (?,?,?,?,?)""",)}



def pSTR2u(pgres,code='utf8'):
        """将PG 返回的结果集中的字符串数据先decode(utf8)再encode(gbk)保证导入sqlite不会是乱码
        限制 : 仅限于oracle中返回的结果集没有多重q嵌套的情况例如: [(....),(.....)....] z这种格式
        如果数据库l里没有使用嵌套表,出来的结果基本都是这种格式,应该可以满足一般的应用了
        """
        lst=[]
        res=[]
        res=[list(i) for i in pgres]

        def isAString(anobj):
            """ 定义测试一个d对象是否是字符串的n内部函数, str=true ,else = false
                """
            return isinstance(anobj, basestring)
        for i in res:
            for j in range(len(i)):
                if i[j] is None:
                    i[j]='null'
                elif isAString(i[j]):
                    try:
                        i[j]=decode(i[j],code).encode('gbk')
                    except:
                        continue
            lst.append(i)
        #print lst
        return lst

def clean_sqlite_table(sqlitedb):
   for i in clean_table_set:
      sqlitedb.cursor().execute("""delete from %s """%i)
   sqlitedb.commit()
   

def insert_sqlite_table(sqlitedb,sql,rows):
   print
   for i in rows:
      print sql,i
      sqlitedb.text_factory= str
      sqlitedb.cursor().execute(sql,i)
   sqlitedb.commit()

def transfer_table(pgdb,sqlitedb):
   
   clean_sqlite_table(sqlitedb)
   
   for table_name in sql_set:
      pgdb.execute("""select * from %s """%table_name)
      table_rows=pgdb.fetchall()
      table_rows=pSTR2u(table_rows)

      if len(table_rows) > 0:
         insert_sqlite_table(sqlitedb,sql_set[table_name][0],table_rows)

def main():
   for db_name in transtfer_db_list:
      pgdb = psycopg2.connect(transtfer_db_list[db_name][0]).cursor()
      sqlitedb = sqllite.connect(transtfer_db_list[db_name][1])
      transfer_table(pgdb,sqlitedb)

main()


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/133735/viewspace-757343/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: MapReduce 初解。
请登录后发表评论 登录
全部评论
oracle MySQL Postgresql 专职数据库dba。 系统架构师。 mysql 官方认知dba 。 15年专职dba 经验。 潜意识沟通实证者 心理咨询师。 禅修布道者, 禅修指导员。 禅定实证者。

注册时间:2010-12-02

  • 博文量
    367
  • 访问量
    1908877