发帖

使用python把氚云数据同步至本地MYSQL做数据分析

产品使用讨论区  / 应用搭建教程  / 正序浏览   © 著作权归作者本人所有

#楼主# 2020-12-30

跳转到指定楼层

注册氚云社区,学习低代码知识,与更多氚友互动交流

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 志伟 于 2020-12-30 16:54 编辑

     公司的数据比较多,需要生成复杂的中国式报表,使用氚云的报表功能暂时未能满足,只能把数据先同步到MYSQL再使用其他报表功能生成适合公司使用的报表。程序已经运行一年,同步数据100W以上,在这里把代码分享出来,方便有同样需求的朋友。qzw本表单字段比较多,没有做表单字段增减,源码复制。
  1、创建conf.py设置基础信息(sql连接、平台信息、需要同步的字段等等)
  
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Dec 30 14:55:38 2020

  4. @author: qzw
  5. """
  6. import pymysql
  7. from DBUtils.PooledDB import PooledDB


  8. def conn_db():
  9.     pool = PooledDB(pymysql, 3, host="localhost", user="root", passwd="XXX", db="test", port=3306)  # 3为连接池里的最少连接数

  10.     conn = pool.connection()
  11.     cursor = conn.cursor()
  12.     return conn, cursor


  13. # 表的所有字段  后期修改表, 修改这里的字段即可,     columns不要换行!!!!!!!
  14. columns="""ObjectId,Name,CreatedById,CreatedByName,OwnerId,OwnerName,OwnerDeptId,OwnerDeptName,F0000030Id,F0000030Name,F0000004Id,F0000004Name,F0000005Id,F0000005Name,F0000007Id,F0000007Name,CreatedTime,ModifiedBy,ModifiedTime,WorkflowInstanceId,Status,SeqNo,F0000032,F0000052,F0000008,F0000046,F0000137,F0000044,F0000045,F0000053,F0000103,F0000055,F0000104,F0000057,F0000105,F0000059,F0000060,F0000061,F0000062,F0000063,F0000064,F0000106,F0000069,F0000101,F0000065,F0000138,F0000066,F0000136,F0000070,F0000067,F0000139,F0000068,F0000112,F0000071,F0000072,F0000140,F0000073,F0000100,F0000074,F0000075,F0000141,F0000076,F0000099,F0000077,F0000078,F0000142,F0000079,F0000098,F0000081,F0000102,F0000082,F0000143,F0000083,F0000084,F0000080,F0000085,F0000086,F0000144,F0000145,F0000087,F0000088,F0000089,F0000090,F0000131,F0000130,F0000091,F0000092,F0000146,F0000147,F0000093,F0000094,F0000095,F0000096,F0000132,F0000133,F0000107,F0000148,F0000109,F0000110,F0000111,F0000108,F0000113,F0000116,F0000114,F0000149,F0000115,F0000118,F0000117,F0000119,F0000120,F0000150,F0000121,F0000123,F0000122,F0000124,F0000125,F0000126,F0000151,F0000128,F0000127,F0000135,F0000134"""

  15. # 默认为0的字段
  16. default_0 = ['F0000103', 'F0000104', 'F0000105', 'F0000059', 'F0000060', 'F0000061', 'F0000064', 'F0000106',
  17.              'F0000101', 'F0000066', 'F0000136', 'F0000068', 'F0000112', 'F0000073', 'F0000100', 'F0000076',
  18.              'F0000099', 'F0000077', 'F0000079', 'F0000098', 'F0000102', 'F0000083', 'F0000084', 'F0000080',
  19.              'F0000086', 'F0000087', 'F0000088', 'F0000089', 'F0000090', 'F0000130', 'F0000092', 'F0000093',
  20.              'F0000094', 'F0000095', 'F0000096', 'F0000133', 'F0000109', 'F0000110', 'F0000111', 'F0000108',
  21.              'F0000113', 'F0000116', 'F0000115', 'F0000117', 'F0000119', 'F0000121', 'F0000122', 'F0000124',
  22.              'F0000125', 'F0000128', 'F0000127', 'F0000135', 'F0000134', 'F0000103']

  23. table_name = "test"   # 数据表名字
  24. ActionName = "LoadBizObjects"
  25. SchemaCode = "表单ID"
  26. EngineCode = "你的EngineCode "
  27. EngineSecret = "你的EngineSecret "
复制代码
2、主程序
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Dec 30 14:55:38 2020

  4. @author: qzw
  5. """
  6. import requests
  7. import json
  8. from conf import conn_db, table_name, ActionName, SchemaCode, EngineCode, EngineSecret, columns
  9. url = 'https://www.h3yun.com/OpenApi/Invoke'
  10. headers = {
  11.     "Content-Type": "Application/json",
  12.     "EngineCode": EngineCode,
  13.     "EngineSecret": EngineSecret
  14. }


  15. def existed_data(sql):
  16.     conn, cursor = conn_db()
  17.     cursor.execute(sql)
  18.     try:
  19.         exist = [d[0] for d in cursor.fetchall()]
  20.     except Exception as e:
  21.         exist = []
  22.     return exist


  23. def insert_data(data, sql):
  24.     if data:
  25.         conn, cursor = conn_db()
  26.         try:
  27.             print("开始插入数据...")
  28.             cursor.executemany(sql, data)
  29.             conn.commit()
  30.             print("数据插入成功")
  31.         except Exception as e:
  32.             print(e)
  33.             conn.rollback()
  34.     else:
  35.         print('无数据插入')


  36. def get_chuanyun_data(value, index):
  37.     print('获取数据中...')
  38.     chuanyun = []
  39.     # for index in range(0, 1000000, 500):
  40.     Filter = {
  41.         "FromRowNum": index,
  42.         "RequireCount": False,
  43.         "ReturnItems": [],
  44.         "SortByCollection": [],
  45.         "ToRowNum": index + 500,
  46.         "Matcher": {
  47.             "Type": "And", "Matchers": [
  48.                 {"Type": "And", "Matchers": [{"Type": "Item", "Name": "SeqNo", "Operator": 7, "Value": value}]}
  49.             ]
  50.         }
  51.     }

  52.     params = {
  53.         "ActionName": ActionName,
  54.         "SchemaCode": SchemaCode,
  55.         "Filter": json.dumps(Filter)
  56.     }
  57.     response = requests.post(url, headers=headers, data=json.dumps(params))
  58.     data = json.loads(response.text)
  59.     try:
  60.         dt = data["ReturnData"]['BizObjectArray']
  61.         chuanyun += dt
  62.     except Exception as e:
  63.         print(e)
  64.         if index == 0:
  65.             return []
  66.         else:
  67.             index += 500
  68.             response = requests.post(url, headers=headers, data=json.dumps(params))
  69.             data = json.loads(response.text)
  70.             try:
  71.                 dt = data["ReturnData"]['BizObjectArray']
  72.                 chuanyun += dt
  73.             except Exception as e:
  74.                 return []
  75.     print('获取数据成功')
  76.     return chuanyun


  77. def format_data(data):
  78.     print('数据格式化中...')
  79.     ret_data = []
  80.     if data:
  81.         for dt in data:

  82.             t = []
  83.             cls = columns.split(',')
  84.             try:
  85.                 dt.pop('CreatedBy')
  86.             except:
  87.                 pass
  88.             try:
  89.                 dt.pop('OwnerId')
  90.             except:
  91.                 pass
  92.             try:
  93.                 dt.pop('OwnerDeptId')
  94.             except:
  95.                 pass
  96.             try:
  97.                 dt.pop('F0000030')
  98.             except:
  99.                 pass
  100.             try:
  101.                 dt.pop('F0000004')
  102.             except:
  103.                 pass
  104.             try:
  105.                 dt.pop('F0000005')
  106.             except:
  107.                 pass
  108.             try:
  109.                 dt.pop('F0000007')
  110.             except:
  111.                 pass

  112.             try:
  113.                 CreatedTime = dt['CreatedTime']
  114.                 CreatedTime = CreatedTime.split(' ')[0] if CreatedTime else ''
  115.                 dt['CreatedTime'] = CreatedTime
  116.             except:
  117.                 pass

  118.             try:
  119.                 F0000008 = dt['F0000008']
  120.                 F0000008 = '/'.join((F0000008.split(' ')[0]).split('/')[:2]) if F0000008  else ''
  121.                 dt['F0000008'] = F0000008
  122.             except:
  123.                 pass

  124.             try:
  125.                 CreatedByObject = dt.pop('CreatedByObject')
  126.                 dt['CreatedById'] = CreatedByObject.pop('ObjectId')
  127.                 dt['CreatedByName'] = CreatedByObject.pop('Name')
  128.             except:
  129.                 dt['CreatedById'] = ''
  130.                 dt['CreatedByName'] = ''
  131.             try:
  132.                 OwnerIdObject = dt.pop('OwnerIdObject')
  133.                 dt['OwnerId'] = OwnerIdObject.pop('ObjectId')
  134.                 dt['OwnerName'] = OwnerIdObject.pop('Name')
  135.             except:
  136.                 dt['OwnerId'] = ''
  137.                 dt['OwnerName'] = ''
  138.             try:
  139.                 OwnerDeptIdObject = dt.pop('OwnerDeptIdObject')
  140.                 dt['OwnerDeptId'] = OwnerDeptIdObject.pop('ObjectId')
  141.                 dt['OwnerDeptName'] = OwnerDeptIdObject.pop('Name')
  142.             except:
  143.                 dt['OwnerDeptId'] = ''
  144.                 dt['OwnerDeptName'] = ''
  145.             try:
  146.                 F0000030Object = dt.pop('F0000030Object')
  147.                 dt['F0000030Id'] = F0000030Object.pop('ObjectId')
  148.                 dt['F0000030Name'] = F0000030Object.pop('Name')
  149.             except:
  150.                 dt['F0000030Id'] = ''
  151.                 dt['F0000030Name'] = ''
  152.             try:
  153.                 F0000004Object = dt.pop('F0000004Object')
  154.                 dt['F0000004Id'] = F0000004Object.pop('ObjectId')
  155.                 dt['F0000004Name'] = F0000004Object.pop('Name')
  156.             except:
  157.                 dt['F0000004Id'] = ''
  158.                 dt['F0000004Name'] = ''
  159.             try:
  160.                 F0000005Object = dt.pop('F0000005Object')
  161.                 dt['F0000005Id'] = F0000005Object.pop('ObjectId')
  162.                 dt['F0000005Name'] = F0000005Object.pop('Name')
  163.             except:
  164.                 dt['F0000005Id'] = ''
  165.                 dt['F0000005Name'] = ''
  166.             try:
  167.                 F0000007Object = dt.pop('F0000007Object')
  168.                 dt['F0000007Id'] = F0000007Object.pop('ObjectId')
  169.                 dt['F0000007Name'] = F0000007Object.pop('Name')
  170.             except:
  171.                 dt['F0000007Id'] = ''
  172.                 dt['F0000007Name'] = ''
  173.             for cl in cls:
  174.                 value = dt[cl] if dt[cl] else ''
  175.                 t.append(value)
  176.             ret_data.append(tuple(t))
  177.     print('数据格式化成功')
  178.     return tuple(ret_data)


  179. def run():
  180.     sql = f"""select SeqNo from {table_name}"""
  181.     index = 0
  182.     while 1:
  183.         exd = existed_data(sql)
  184.         chuanyun_dt = get_chuanyun_data(exd, index)
  185.         if not chuanyun_dt:
  186.             break
  187.         new_data = format_data(chuanyun_dt)
  188.         insert_sql = f"""INSERT INTO {table_name}({columns}) VALUES ({','.join(['%s'] * len(columns.split(',')))})"""
  189.         insert_data(new_data, insert_sql)
  190.         index += 500


  191. if __name__ == '__main__':
  192.     run()

复制代码

评分

参与人数 1威望 +5 金币 +200 收起 理由
社区小站长 + 5 + 200 感谢发布原创内容,奖励威望5,金币200!.

查看全部评分

回复

使用道具

0

主题

3

帖子

354

金币

奥哲渠道服务商

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
469

2021跨年勋章氚云标准版氚云专业版

拾柒 发表于 2021-1-21 11:55:19
学习了。
回复

使用道具 举报

0

主题

1

帖子

42

金币

lv3

Rank: 3Rank: 3Rank: 3

积分
52

氚云专业版氚云标准版

小强0991 发表于 2021-1-17 18:29:56
楼主,真牛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

志伟

lv5

  • 主题

    1

  • 帖子

    4

  • 关注者

    3

小黑屋|氚云社区 |粤ICP备15096637号-1
Powered by Discuz! X3.4 Licensed  © 2001-2017 Comsenz Inc.