精华内容
下载资源
问答
  • A是有日期段数据 B是一天一条数据 举例:A若有一条是...对应在A中得出一个新字段就是BBZSC的合计值7.5+7.5+2=17。 ![图片说明](https://img-ask.csdn.net/upload/201710/12/1507797860_686035.png)
  • 最近在做一个数据库异构复制的项目,客户表示需要一个数据比对的工具,我就自己写了一个异构数据库的比对python脚本.这个比对脚本只能比对数量,不能比对具体的记录.使用的sql语句也是最基础的select count(*) 这种,...

    最近在做一个数据库异构复制的项目,客户表示需要一个数据比对的工具,我就自己写了一个异构数据库的比对python脚本.这个比对脚本只能比对数量,不能比对具体的记录.使用的sql语句也是最基础的select count(*) 这种,没有开并发所以对大表可能比对时间稍长.

    基本原理是将需要比对的数据写到一张表里,先读取那个表里的数据,取出需要比对的表.然后创建多进程,同时在原端和目标端count.然后将count的结果写到一个excel文件中.

    其中最关键的就是那张表.只要将那张表里的数据搞对了,基本就不会有什么问题.

    目前支持的数据库有oracle,mysql,postgresql,sqlserver.程序分为三个部分

    1.数据库配置文件

    首先需要在python代码的相同目录下写一个名为check.ini的配置文件.下面一个配置文件例子:

    [DATA]
    #配置原端数据库,下面的ORACLE需要与后面的项匹配
    source=ORACLE
    #配置目标端数据库,下面的POSTGRESQL需要与后面的项匹配
    target=POSTGRESQL
    #配置比对表的数据库,需要与下面的配置项匹配
    check_node=ORACLE
    #配置比对表数据库的用户,如果是oracle是用户,如果是mysql,pg,mssql则是数据库名
    check_owner=suq
    #配置比对表的表名,区分大小写
    check_table=check_table
    
    #配置mysql的连接串.注意MYSQL必须大写而且必须是以MYSQL开头,例如想比对多个mysql可以写MYSQL1,MYSQL2等
    #下面的几个配置同样需要以相应例子开头,因为程序就是以项的开头来确认是哪种数据库的
    [MYSQL]
    db_host=192.168.56.25
    db_port=3306
    db_user=root
    db_pwd=root
    db_dbname=major
    
    
    [ORACLE]
    db_host=192.168.56.30
    db_port=1521
    db_user=dsg
    db_pwd=dsg
    db_sid=bre1
    
    
    
    [POSTGRESQL]
    db_host=192.168.56.50
    db_port=5432
    db_user=postgres
    db_pwd=postgres
    db_dbname=msgdb
    
    
    
    [MSSQL]
    db_host=192.168.56.101
    db_port=1433
    db_user=sa
    db_pwd=sa
    db_dbname=master

    2.创建一个比对表.

    例如我上面的例子放在suq用户下的check_table中

    具体的表结构如下:

    SQL> desc check_table
     Name					   Null?    Type
     ----------------------------------------- -------- ----------------------------
     SOWNER 					    VARCHAR2(30)
     SNAME						    VARCHAR2(30)
     TOWNER 					    VARCHAR2(30)
     TNAME						    VARCHAR2(30)
    
    分别表示原端的用户名,表名,目标端用户名表名,如果不是用户的那么就是数据库名.

    看一下表内我的测试数据:

    SQL> select * from check_table;
    
    SOWNER			       SNAME			      TOWNER			     TNAME
    ------------------------------ ------------------------------ ------------------------------ ------------------------------
    suq			       "t1"			      suq			     t1
    suq			       "t2"			      suq			     t2
    suq			       "t3"			      suq			     t3
    suq			       "t4"			      suq			     t4
    
    这里的数据要特别注意,必须写对否则可能运行会报错.需要注意的一般原因是不同的数据库对大小写敏感不同.因此建议在写好这些数据后,手动到数据库查一下,例如

    select count(*) from suq."t1"

    看这样的sql对不对.

    3.就是主程序

    需要注意的是我连接各种数据库分别使用的如下python模块,写excel使用XlsxWriter模块:

    C:\Users\think>pip list
    cx-Oracle (5.2.1)
    MySQL-python (1.2.4)
    psycopg2 (2.6.2)
    pymssql (2.1.3)
    XlsxWriter (0.8.5)
    下面是具体的python代码:

    #coding:utf-8
    import cx_Oracle as ora
    import MySQLdb as my
    import psycopg2 as post
    import pymssql as ms
    import ConfigParser as conf
    import multiprocessing as  mul
    import xlsxwriter 
    import time
    
    
    
    def connect(cfg,db):
        if db[0:5] == 'MYSQL':
            db_host=cfg.get(db,'db_host')
            db_port=cfg.get(db,'db_port')
            db_user=cfg.get(db,'db_user')
            db_pwd=cfg.get(db,'db_pwd')
            db_dbname=cfg.get(db,'db_dbname')
            conn = my.connect(host=db_host,port=int(db_port),user=db_user,passwd=db_pwd,db=db_dbname)
            return conn
        elif db[0:6] == 'ORACLE':
            db_host=cfg.get(db,'db_host')
            db_port=cfg.get(db,'db_port')
            db_user=cfg.get(db,'db_user')
            db_pwd=cfg.get(db,'db_pwd')
            db_sid=cfg.get(db,'db_sid')
            conn = ora.connect(db_user,db_pwd,db_host+':'+db_port+'/'+db_sid)
            return conn
        elif db[0:10] == 'POSTGRESQL':
            db_host=cfg.get(db,'db_host')
            db_port=cfg.get(db,'db_port')
            db_user=cfg.get(db,'db_user')
            db_pwd=cfg.get(db,'db_pwd')
            db_dbname=cfg.get(db,'db_dbname')
            conn = post.connect(host=db_host,port=db_port,user=db_user,password=db_pwd,database=db_dbname)
            return conn
        elif db[0:5] == 'MSSQL':
            db_host=cfg.get(db,'db_host')
            db_port=cfg.get(db,'db_port')
            db_user=cfg.get(db,'db_user')
            db_pwd=cfg.get(db,'db_pwd')
            db_dbname=cfg.get(db,'db_dbname')
            conn = ms.connect(host=db_host,port=db_port,user=db_user,password=db_pwd,database=db_dbname)
            return conn
            
    
    
    def check(cfg,db,check_owner,check_table):
        conn=connect(cfg,db)
        cursor=conn.cursor()
        sql='select * from '+check_owner+'.'+check_table
        cursor.execute(sql)
        table_list=[]
        alldata=cursor.fetchall()
        for i in alldata:
            table_list.append(i)
        #print table_list
        return table_list
    
    
    
    def getcount(cfg,db,sql,q):
        conn = connect(cfg,db)
        cursor=conn.cursor()
        try:
            cursor.execute(sql)
            countval = cursor.fetchall()[0][0]
            q.put(countval)
        except Exception,e:
            countval="Error : "+str(e)
            q.put(countval)
    
    
    def isdigit(num):  
        try:  
            int(num)  
            return True  
        except:  
            return False  
    
    
    
    def comp(cfg,source,target,tablelist):
        ###excel start
        xlsxname='check_'+str(time.strftime("%Y%m%d%H%M", time.localtime()))+'.xlsx'
        workbook=xlsxwriter.Workbook(xlsxname)
        top=workbook.add_format({'border':6,'align':'center','bg_color':'cccccc','font_size':13,'bold':True})
        format_data_normal=workbook.add_format({'align':'center','font_size':13})
        format_data_warn=workbook.add_format({'align':'center','font_size':13,'bg_color':'ff0000'})
        format_data_err=workbook.add_format({'align':'center','font_size':13,'bg_color':'ffff00'})
        worksheet = workbook.add_worksheet('sheet1')
        worksheet.set_column('A:A',12)
        worksheet.set_column('B:B',40)
        worksheet.set_column('C:C',12)
        worksheet.set_column('D:D',12)
        worksheet.set_column('E:E',40)
        worksheet.set_column('F:F',12)
        worksheet.set_column('G:G',12)
        title=[u'源端用户',u'源端表名',u'源端数据量',u'目标端用户',u'目标端表名',u'目标端数据量',u'差异条数']
        worksheet.write_row('A1',title,top)
        ###excel stop
        length=len(tablelist)
        for i in range(length):
            check_result=[]
            sowner=tablelist[i][0]
            sname=tablelist[i][1]
            towner=tablelist[i][2]
            tname=tablelist[i][3]
            sql_s='select count(*) from '+sowner+'.'+sname
            sql_t='select count(*) from '+towner+'.'+tname
            #sql_t='select count(*) from '+towner+'.'+'\"'+tname+'\"'
            q1=mul.Queue()
            q2=mul.Queue()
            p1=mul.Process(target = getcount,args = (cfg,source,sql_s,q1))
            p2=mul.Process(target = getcount,args = (cfg,target,sql_t,q2))
            p1.start()
            p2.start()
            count_s=q1.get()
            count_t=q2.get()
            p1.join
            p2.join
            check_result.append(sowner)
            check_result.append(sname)
            check_result.append(count_s)
            check_result.append(towner)
            check_result.append(tname)
            check_result.append(count_t)
            print '%s %s %s %s %s %s'  %(sowner,sname,count_s,towner,tname,count_t)
            #print check_result
            if isdigit(count_s) and isdigit(count_t):
                check_result.append(count_s-count_t)
                if count_s == count_t:
                    worksheet.write_row('A'+str(2+i),check_result,format_data_normal)
                else:
                    worksheet.write_row('A'+str(2+i),check_result,format_data_warn)
            else:
                check_result.append("Error")
                worksheet.write_row('A'+str(2+i),check_result,format_data_err)
        workbook.close()
    
    
    
    
        
    
    if __name__ == "__main__":
        print "AT time {0}".format(time.ctime())
        print "Begin compare ..."
        cfg=conf.ConfigParser()
        cfg.read('check.ini')
        source=cfg.get('DATA','source')
        target=cfg.get('DATA','target')
        check_node=cfg.get('DATA','check_node')
        check_owner=cfg.get('DATA','check_owner')
        check_table=cfg.get('DATA','check_table')
    
        tablelist=check(cfg,check_node,check_owner,check_table)
        comp(cfg,source,target,tablelist)
        print "AT time {0}".format(time.ctime())
        print "compare complete!"
        raw_input("Press <ENTER>")
    
    
    


    执行这段代码后就会读取check.ini文件,获取需要比对的原端和目标端数据库的信息,以及比对表的信息,首先将比对的表获取写到一个数组中.然后使用for循环对表进行count,再写到excel中.excel名为check_XXXX.xlsx.xxx为时间.如果在执行sql的时候报错,那么excel中以黄色标出,如果比对原端和目标端数据不一致以红色标出.

    下面是我比对oracle和pg中的一个结果:








    展开全文
  • SQL Server两表比对数据

    千次阅读 2019-06-11 11:14:10
    sql server两表比对数据是否完全一直 使用sql server的tablediff工具进行比对 打开cmd cd切换路径到你sqlserver数据库的这目录下:Microsoft SQL Server\100\COM 本人路径:C:\Program Files\Microsoft SQL Server...

    sql server两表比对数据是否完全一直
    使用sql server的tablediff工具进行比对

    打开cmd cd切换路径到你sqlserver数据库的这个目录下:Microsoft SQL Server\100\COM
    本人路径:C:\Program Files\Microsoft SQL Server\100\COM>
    输入tablediff运行
    然后输入命令进行比对
    tablediff -sourceserver 数据库地址A(124.000.000.000) -sourcedatabase “数据库A(有双引号)” -sourceschema “源架构” -sourcetable “表名称” -sourceuser “源用户(数据库用户名)” -sourcepassword “源密码(数据库密码)” -destinationserver 数据库地址B(124.000.000.000) -destinationdatabase “数据库B(有双引号)” -destinationschema “源架构” -destinationtable “表名称” -destinationuser “源用户(数据库用户名)” -destinationpassword “源密码(数据库密码)”

    tablediff -sourceserver 124.000.000.00.0000 -sourcedatabase “demo” -sourceschema “dbo” -sourcetable “surfaceA” -sourceuser “aa” -sourcepassword “123456” -destinationserver 124.000.000.00.0000 -destinationdatabase “test” -destinationschema “dbo” -destinationtable “surfaceB” -destinationuser “aa” -destinationpassword “123456”

    源架构test数据库名 dbo源架构 表名
    在这里插入图片描述

    运行情况:
    在这里插入图片描述
    如果是SQL Server两数据库对比更改情况请看另一篇文章
    https://blog.csdn.net/qq_41984953/article/details/91414673

    展开全文
  • 两个表格内要比对的项目是一样的,打开的两个表格,一个是正确答案,一个是学生的答案。想要比对两个Excel的答案,并且将不同之处返回到正确答案的sheet2里面,写明第几题,答案不同,然后正确答案是啥学生答案是...
  • 在mysql中,有a、b两,字段相同,但内容有差异,且两都达200万行之多,通过...比对a有id、b没有时,运行几分钟后报"lost connection during query",也按度娘的各种建议做过优化,还是无解,求大师指点。
  • 一、方法/步骤(转)---注意:... 1 第一步:我们打开一个excel,需要在另一个表中匹配出相应同学的班级信息。 2 第二步:我们把光标定位在需要展示数据的单元格中,如下图所示。 3 第三步:在单元格中输入“=vl...

    一、方法/步骤(转)---注意:比对的时候,“被比对表”的唯一号务必放在首列

    1. 1

      第一步:我们打开一个excel表,需要在另一个表中匹配出相应同学的班级信息。

      如何将一个excel表格的数据匹配到另一个表中

      如何将一个excel表格的数据匹配到另一个表中

    2. 2

      第二步:我们把光标定位在需要展示数据的单元格中,如下图所示。

      如何将一个excel表格的数据匹配到另一个表中

    3. 3

      第三步:在单元格中输入“=vl”,然后会自动提示出VLOOKUP函数,双击蓝色的函数部分。

      如何将一个excel表格的数据匹配到另一个表中

    4. 4

      第四步:我们可以看到,单元格中显示出完整的VLOOKUP函数。

      如何将一个excel表格的数据匹配到另一个表中

    5. 5

      第五步:选择第一列中需要匹配数据的单元格,只选中一个就可以,然后输入英文状态下的逗号“,”。

      如何将一个excel表格的数据匹配到另一个表中

    6. 6

      第六步:返回到第二张表【百度经验-表2】,选中全部数据。

      如何将一个excel表格的数据匹配到另一个表中

    7. 7

      第七步:因为我们要返回的是【百度经验-表2】中第四列的班级信息,所以在公式中再输入“4,”(逗号是英文的)。(ps:提示信息让我们选择“TRUE”或“FALSE”,不用选,直接按回车键就可以)

      如何将一个excel表格的数据匹配到另一个表中

    8. 8

      第八步:按下回车键之后,展示出匹配到数据,效果如下图。

      如何将一个excel表格的数据匹配到另一个表中

    9. 9

      第九步:如果想要把一列中的数据都匹配出来,只需要按下图操作。

      如何将一个excel表格的数据匹配到另一个表中

    10. 10

      完成操作,最终效果如下。

      如何将一个excel表格的数据匹配到另一个表中

      END

    注意事项

    • 输入的符号需要是英文状态下的,如:逗号。

    • 所匹配的数据需要和当前数据不在同一个excel表,不然会匹配错误。

    • 111659_IvNf_2853925.png

    • 语法规则:
      VLOOKUP( lookup_value, table_array, col_index_num, range_lookup )

    • lookup_value(目标查找值): 可以为数值、文字字符串、或参照地址,主要使用参照地址,如:A3
    • table_array(查找区域): 如:B3:D100
    • col_index_num(返回显示列序号):查找范围内的栏数,如:B3:D100范围的话,如果col_index_num=2,则返回C列(即范围内第二列的值)
    • range_lookup(是否模糊匹配): 0或False为精确匹配,1或True为近似匹配

    转载于:https://my.oschina.net/yuhuiyoki/blog/1823699

    展开全文
  • oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon 1.情景描述  testdata数据展示  testdata2数据展示  数据对比:  testdata有31条数据...
     

    oracle 批量更新之将一个表的数据批量更新至另一个表

    CreationTime--2018年7月3日17点38分

    Author:Marydon

    1.情景描述

      testdata表数据展示

      testdata2表数据展示

      数据对比:

      testdata表有31条数据,且有9条数据的userid与testdata2表不一致(自己独有);

      testdata2表有24条数据,且有2条数据的userid与testdata2表不一致(自己独有)。

      表关联:testdata表和testdata2表的userid具有关联关系

      需求说明:

      需要将testdata中的22条数据更新到testdata2表中   

    2.错误方式

      这种方式,由于没有设置更新的限制条件,导致:

      不仅会更新需要更新的表记录,还会将testdata2中剩余的数据字段更新为空。

      

    3.解决方案

      添加where条件,只对两表共有的数据进行更新。

      2018/12/05

      正确格式:

    UPDATE TABLE1 T1
       SET (T1.COLUMN1, T1.COLUMN2) =
           (SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID) --两表能够进行关联的字段(一般是主键)
     WHERE EXISTS (SELECT 1 FROM TABLE2 T2 WHERE T2.ID = T1.ID);

      错误格式:

    UPDATE TABLE1 T1
       SET (T1.COLUMN1, T1.COLUMN2) =
           (SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID)
     WHERE EXISTS (SELECT 1 FROM TABLE1 T1 WHERE T1.ID = T2.ID);--exists()访问不到t2表

      说明:虽然理论上,它们执行效果是一样的,但是由于exists()函数访问不到t2表,所以查询访问不到的那张表t2。

      套用

    --添加限制条件,进行更新
    update testdata2 t2
       set (t2.usercode, t2.userpassword) =
           (select t.usercode, t.userpassword
              from testdata t
             where t.userid = t2.userid)
     where exists (select 1 from testdata t where t.userid = t2.userid);

      避免了全表更新。 

      2018/12/07

    4.索引的重要性

      更新1w条以上的数据时,where后面跟的条件一定要加上索引,不然哭都来不及。

      需要更新22w条数据,两张表的ID_CARD字段没有建索引

       两张表的ID_CARD字段建立索引后

      这是我的亲身经历,没有建索引前,执行了4个小时,没有更新完,后来由于电脑关机,导致任务终止;

      建索引后,同样执行该sql,更新22w条数据只用了4秒!!!  

    说明:对于要执行的更新sql,使用plsql的预测功能时预测不准确,只做参考。

    5.小结

      A表中有几个字段的值需要批量更新,如果一个一个进行修改,太慢了:

      将批量修改后的内容放到一个新的表中B,并与要更新的表A建立关联关系。

      第一步:建新表

      两表关联字段(column1):A表中该字段必须具有唯一性;

      要更新的字段(column5,cloumn6,...)。

      第二步:导数据

      将新表字段及每条记录更新后内容放到excel中,导入oracle数据库中B表。

      第三步:根据两表关联关系,将B表数据批量更新到A表中。

     

     
    展开全文
  • Access中将一个表中的字段的值赋值到另一个表中对应属性的字段中 1.举例 将一个表中的一批记录更新到另外一个表中  table1  ID f1 f2  table2  ID f1 f2  先要将table2中的f1 f2 更新到table1(相同的ID...
  • sta2013数据库中有两个表cjr2013xiaotang cjr,两个表均以sfzhm唯一标识条记录,都有zje(总金额)字段,对两个表的zje进行求和: cjr2013xiaotang:sum(zje):473100,正确数据 cjr: sum(zje):426100,错误...
  • navicat中复制表结构: 1.可以直接导出结构执行的sql语句 操作如下:选中要复制的->...如何比对两张的差异数据: 案例如下, 进行编写 SELECT * FROM 第张表 WHERE EXISTS ( SELECT 1 FROM 第二张...
  • '如果检查有一个表未查询到记录,或者需要比对的KPI为空,则不比对直接退出   Exit Sub   End If   '复制网元及时间列   ActiveSheet.Range(Cells(3 + 1, 1), Cells(3+ 1 + recordNo - 1, 2))...
  • 最近这几天在课设的过程中,遇到了一个问题。 简单来说,我现在有两张数据,一张是enployee,员工的信息;一张是user,可以登录用户的信息。之间通过 emp_no关联。两张对应的sql代码: user: INSERT ...
  • 本文将来讲解一下种常见的线性数据结构—链表,因为链表和数组一样都是种线性的数据结构,但是它俩的实现原理是完全不同的,所以在讲解链表之前,我们来回顾一下 数组 结构。
  • 我有两张perssionrole: 现在要选择角色对应的菜单,就是说选择perssion中perssionid包含在role的perssionids字段中的项,可以使用charindex这函数实现 select * from Perssions as p inner...
  • 比对两个序列时,不仅要考虑完全匹配的字符,还要考虑一个序列中的空格或间隙(或者,相反地,要考虑另一个序列中的插入部分)不匹配,这两个方面都 可能意味着突变。在序列比对中,需要找到最优的比对(最优...
  • 所匹配的数据需要当前数据不在同一个excel,不然会匹配错误。 以上就是VLOOKUP函数将一个excel表格的数据匹配到另一个表中方法介绍,希望能对大家有所帮助! python风控评分卡建模和风控常识 ...
  • Sub AutoInputValNewExcel() Dim sh1, sh2 As Worksheet ...删除第一个没有用的sheet MsgBox ( " 操作完成 " ) End Sub 如下图 转载于:https://www.cnblogs.com/hdl217/p/9365753.html
  • 数组也是有一定的缺点的,如果我们不知道某个元素的下标值,而只是知道该元素在数组中,这时我们想要获取该元素就只能对数组进行线性查找,即从头开始遍历,...所以,为了解决上述数组的不足之处,引入了哈希的概念。
  • 多序列比对软件:Muscle,ClustalWT-coffee的简单比较 转自:https://www.plob.org/article/4104.html ClustalW是现在用的最广和最经典的多序列比对软件, Muscle是速度最快的多序列比对,T-coffee是...
  •  --执行比对数据库  execute CompareBaseObject @base1,@base2,@output_table  end  else  begin  select @base2+'库不存在,请检验数据库名称!'  end  end  else  begin  select...
  • mysql使用技巧之比较两个表是否有不同的数据

    万次阅读 热门讨论 2018-07-05 16:19:24
    在数据迁移中,我们经常需要比较两个,以便在一个表中标识另一个表中没有相应记录的记录。 例如,我们有一个新的数据库,其架构与旧数据库不同。我们的任务是将所有数据从旧数据库迁移到新数据库,并验证数据是否...
  • 假设现在有文本框1文本框2,1用来输入工号,根据输入的工号值去数据库中的用户查询对应的姓名,将查询的结果作为文本框2的内容。1、文本框1加上onChange()方法:&lt;input type="text" name="...
  • 经常被人问到怎么对两份Excel数据进行比对,提问的往往都很笼统;在工作中,有时候会需要对两份内容相近的数据记录清单进行比对,需求...应用案例比对取出两的交集(相同部分) Sheet1中包含了份数据清单A,s...
  • BS架构CS架构的比对

    千次阅读 多人点赞 2018-11-22 19:01:48
    BS架构CS架构的比对 1、CS、BS架构定义 CS(Client/Server):客户端----服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为...
  • 这里,我想实现的是:让1中的查询结果与2中的查询结果,进行一个运算(根据goosId,1对应2中的goosId,1的number列去乘以2中的sum(quantity)列,最后显示出运算后的列,即goosId列,partsId列,number*...
  • 业务场景:由于新老系统迁移,需要将老数据中关联了对应过程的文件,通过对应过程这字段与新系统中关联了对应过程的文件,进行比对,难点在于,新系统中的部分对应过程名称已更改,如老系统中叫“管理新技术”的,...
  • 被分割的字段一定是有限而且数量较少的,我们不可能在一个字符串中存储无限多个字符这个字段所属的与这个字段关联的,一定是一对多的关系 下面举例说明: 原: leader id name 1 李一 2 刘二 3
  • 我用kettle从一个数据库中读取数据,有一个字段A,然后想根据另外一个数据库中的一个字段A对这部分数据进行过滤,筛选出数据中字段A在第二张表的字段A的记录,不同数据库不太好联查,而且数据量有点大 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,844
精华内容 19,937
关键字:

一个表和另一个表比对