Python sql server和postgresql的表结构转换

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

#coding=utf-8
#import _mssql
import psycopg2,pymssql
import types
TableSpace='ABS.'
class SyncDataBase():
    def __init__(self):
        self.pgconn=psycopg2.connect("dbname=absob host=192.168.1.32 user=postgres password=12345")
        self.msconn=pymssql.connect(host="192.168.1.20",user="sa",password="sa",database="absOB090615")
    def commit(self):
        self.pgconn.commit()
    def close(self):
        self.pgconn.close()
        self.msconn.close()
    def rollback(self):
        self.pgconn.rollback()
    def exesyncdb(self):
        mscursor=self.msconn.cursor()
        sql=("SELECT COUNT(COLUMNNAME) AS CT,TABLENAME FROM "\
                 "(SELECT A.NAME AS COLUMNNAME,B.NAME AS TABLENAME FROM SYSCOLUMNS A RIGHT JOIN "\
                 " SYSOBJECTS B ON A.ID=B.ID WHERE B.TYPE='U' AND B.NAME NOT IN ('dtproperties','0626')) A "\
                 " GROUP BY TABLENAME ")
        #print sql
        mscursor.execute(sql)
        table=mscursor.fetchall()
        if(table is None or len(table)<=0):
            return
        else:
            for row in table:
                #print row[1]
                self.executeTable(row[1],row[0])
                print "%s is execute success"%row[1]
    def executeTable(self,tablename,count):
        #print tablename
        sql1="SELECT * FROM %s"%tablename
        mscursor=self.msconn.cursor()
        mscursor.execute(sql1)
        table=mscursor.fetchall()
        if(table is None or len(table)<=0):
            mscursor.close()
            return
        lst_result=self.initColumn(table)
        #print "column"
        mscursor.close()
        sql2=self.initPgSql(tablename,count)
        pgcursor=self.pgconn.cursor()
        pgcursor.executemany(sql2,lst_result)
        pgcursor.close()
    def initPgSql(self,tablename,count):
        columns=[]
        for i in range(count):
            columns.append("%s")
        strs=",".join(columns)
        sql="INSERT INTO %s%s VALUES(%s)"%(TableSpace,tablename,strs)
        return sql
    #-----------------------------
    #字段编码和相关格式初始化
    #-----------------------------
    def initColumn(self,table):
        if(table is None or len(table)<=0):
            return None
        lst_result=[]
        for row in table:
            i=0
            lines=[]
            for column in row:
                if(column is not None and types.StringType==type(column)):
      #lines.append(unicode(column))
                    try:
                        lines.append((column.decode('cp936')).encode('utf-8'))
                    except:
                        lines.append(column)
                else:
                    lines.append(column)
                i+=1
            lst_result.append(lines)
        return lst_result
    #-----------------------
    #测试数据表导入结果测试
    #----------------------
    def exeBulletin(self):
        mscursor=self.msconn.cursor()
        sql=("SELECT * FROM BBULLETIN")
        mscursor.execute(sql)
        table=mscursor.fetchall()
        if(table is None or len(table)<=0):
            mscursor.close()
            return
        lst_result=initColumn(table)
        mscursor.close()
        pgcursor=self.pgconn.cursor()
        ret=pgcursor.executemany("INSERT INTO "+TableSpace+"BBULLETIN VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",lst_result)
        pgcursor.close()
    def getAllTable(self):
        mscursor=self.msconn.cursor()
        sql=("SELECT NAME FROM sysobjects WHERE TYPE='U' AND NAME NOT IN ('dtproperties','0626')")
        mscursor.execute(sql)
        table=mscursor.fetchall()
        if(table is None or len(table)<=0):
            mscursor.close()
            return
        pgcursor=self.pgconn.cursor()
        for row in table:
            sqlext=self.createTable(row[0])
            print sqlext
            if(sqlext is not None):
                pgcursor.execute(sqlext)
        mscursor.close()
        pgcursor.close()
    #----------------------
    #根据SQL SERVER数据库基本结构创建PostgreSQL数据库表结构
    #----------------------
    def createTable(self,tablename):
        mscursor=self.msconn.cursor()
       # sql=("SELECT A.NAME AS COLUMNNAME,C.NAME,A.LENGTH,B.NAME AS TABLENAME "\
       #          " FROM SYSCOLUMNS A RIGHT JOIN  SYSOBJECTS B ON A.ID=B.ID "\
       #          " LEFT JOIN SYSTYPES C ON C.XTYPE=A.XTYPE "\
       #          " WHERE B.TYPE='U' AND B.NAME=%s AND B.NAME NOT IN ('dtproperties','BUPLOADCUSTOMER','RFREIGHT')")
        sql=("SELECT A.NAME AS COLUMNNAME,C.NAME,A.LENGTH,B.NAME AS TABLENAME,ISNULL(D.PKS,0) AS PKEY,E.CT "\
                 " FROM SYSCOLUMNS A RIGHT JOIN  SYSOBJECTS B ON A.ID=B.ID "\
                 " LEFT JOIN SYSTYPES C ON C.XTYPE=A.XTYPE LEFT JOIN "\
                 " (SELECT A.NAME,1 AS PKS FROM SYSCOLUMNS A "\
                 " JOIN SYSINDEXKEYS B ON A.ID=B.ID AND A.COLID=B.COLID AND A.ID=OBJECT_ID(%s)"\
                 " JOIN SYSINDEXES C ON A.ID=C.ID AND B.INDID=C.INDID "\
                 " JOIN SYSOBJECTS D ON C.NAME=D.NAME AND D.XTYPE='PK') D "\
                 " ON A.NAME =D.NAME "\
                 " LEFT JOIN (SELECT COUNT(A.COLUMNNAME) AS CT,%s AS TABLENAME  FROM "\
                 " (SELECT A.NAME AS COLUMNNAME,D.NAME AS TABLENAME FROM SYSCOLUMNS A "\
                 " JOIN SYSINDEXKEYS B ON A.ID=B.ID AND A.COLID=B.COLID AND A.ID=OBJECT_ID(%s) "\
                 " JOIN SYSINDEXES C ON A.ID=C.ID AND B.INDID=C.INDID "\
                 " JOIN SYSOBJECTS D ON C.NAME=D.NAME AND D.XTYPE='PK') A GROUP BY A.TABLENAME) E "\
                 " ON B.NAME=E.TABLENAME "\
                 " WHERE B.TYPE='U'  AND B.NAME=%s AND B.NAME NOT IN ('dtproperties') ")
        mscursor.execute(sql,(tablename,tablename,tablename,tablename))
        table=mscursor.fetchall()
        if(table is None or len(table)<=0):
            mscursor.close()
            return
        csql="CREATE TABLE "+TableSpace+"%s ("%tablename
        lst=[]
        for row in table:
            if(row[1]=="int"):
                if(row[4]==1 and len(lst)<=0 and row[5]==1):
                    lst.append(row[0]+" serial PRIMARY KEY NOT NULL")
                elif(row[4]==1 and len(lst)>0 and row[5]==1):
                    lst.append(","+row[0]+" serial PRIMARY KEY NOT NULL")
                elif(row[4]==0 and len(lst)<=0 and row[5]!=0):
                    lst.append(row[0]+" INT DEFAULT 0")
                elif(len(lst)>0):
                    lst.append(","+row[0]+" INT DEFAULT 0")
                else:
                    lst.append(row[0]+" INT DEFAULT 0")
            if(row[1]=="varchar"):
                if(len(lst)<=0):
                    lst.append(row[0]+" varchar("+str(row[2])+")")
                else:
                    lst.append(","+row[0]+" varchar("+str(row[2])+")")
            if(row[1]=="text"):
                if(len(lst)<=0):
                    lst.append(row[0]+" text ")
                else:
                    lst.append(","+row[0]+" text ")
            if(row[1]=="datetime"):
                if(len(lst)<=0):
                    lst.append(row[0]+" timestamp without time zone NULL ")
                else:
                    lst.append(","+row[0]+" timestamp without time zone NULL ")
            if(row[1]=="numeric" or row[1]=="money" or row[1]=="float" or row[1]=="decimal"):
                if(len(lst)<=0):
                    lst.append(row[0]+" decimal(18,2) DEFAULT 0.00 ")
                else:
                    lst.append(","+row[0]+" decimal(18,2) DEFAULT 0.00 ")
            if(row[1]=="bit"):
                if(len(lst)<=0):
                    lst.append(row[0]+" boolean DEFAULT FALSE ")
                else:
                    lst.append(","+row[0]+" boolean DEFAULT FALSE ")
            if(row[1]=="tinyint"):
                if(len(lst)<=0):
                    lst.append(row[0]+" smallint DEFAULT 0 ")
                else:
                    lst.append(","+row[0]+" smallint DEFAULT 0 ")
            if(row[1]=="char"):
                if(len(lst)<=0):
                    lst.append(row[0]+" char("+str(row[2])+")")
                else:
                    lst.append(","+row[0]+" char("+str(row[2])+")")
        lst.append(");")
        mscursor.close()
        return csql+" ".join(lst)
if __name__=="__main__":
    sdb=SyncDataBase()
    try:
        #print sdb.initPgSql("aaa",10)
        #sdb.getAllTable()
        sdb.exesyncdb()
    except Exception,e:
        print e
        sdb.rollback()
    else:
        sdb.commit()
    sdb.close()
    print "ok........"