全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python实现简单的多任务mysql转xml的方法

本文实例讲述了Python实现简单的多任务mysql转xml的方法。分享给大家供大家参考,具体如下:

为了需求导出的格式尽量和navicat导出的xml一致。

用的gevent,文件i/o操作会阻塞,所以并不会完全异步。

1. mysql2xml.py:

# -*- coding: utf-8 -*-
'''
Created on 2014/12/27
@author: Yoki
'''
import gevent
import pymysql
from pymysql.cursors import DictCursor
import re
import codecs
db_conn = None
def init_mysql_connect(*args, **kwargs):
  global db_conn
  db_conn = pymysql.connect(*args, **kwargs)
def list_to_xml(result_cur, key_list):
  '''
  mysql 结果集转xml,非xml标准导出方式; xml dom 不支持相同名字的node
  :param result_cur:
  :param key_list:
  :return:
  '''
  content = ''
  content += '<?xml version="1.0" encoding="UTF-8" ?>\r\n'
  content += '<RECORDS>\r\n' # root节点
  for item in result_cur:
    content += '\t<RECORD>\r\n'
    for k in key_list:
      v = item.get(k, '')
      real_value = v
      content += '\t\t<%s>%s</%s>\r\n' % (k, real_value, k)
    content += '\t</RECORD>\r\n'
  content += '</RECORDS>\r\n'
  return content
def get_table_rows(tb_name):
  '''
  获取mysql表rows
  :param tb_name:
  :return:
  '''
  global db_conn
  rows = []
  cursor = db_conn.cursor(cursor=DictCursor)
  cursor.execute('select * from %s' % tb_name)
  for row in cursor:
    rows.append(row)
  return rows
def get_table_keys(tb_name):
  '''
  获取表中字段,顺序 为创建表时的顺序
  :param tb_name:
  :return:
  '''
  global db_conn
  cursor = db_conn.cursor(cursor=DictCursor)
  cur = cursor.execute('show create table %s' % tb_name)
  if cur != 1:
    raise Exception
  for r in cursor:
    create_sql = r['Create Table']
    fields = re.findall('`(.*?)`', create_sql)
    result = []
    # 处理字段
    for i in xrange(1, len(fields)):
      field = fields[i]
      if field in result:
        continue
      result.append(field)
    return result
  return []
def mysql_to_xml(tb_name, output_dir='xml', postfix='xml'):
  '''
  mysql数据导出xml,
  :param tb_name: 数据库表名
  :param output_dir:
  :param postfix:
  :return:
  '''
  rows = get_table_rows(tb_name)
  keys = get_table_keys(tb_name)
  content = list_to_xml(rows, keys)
  fp = codecs.open('%s/%s.%s' % (output_dir, tb_name, postfix), 'w', 'utf-8')
  fp.write(content)
  fp.close()
tb_list = [
  'tb_item',
  'tb_state'
]
if __name__ == '__main__':
  init_mysql_connect(host="localhost", user='user', password="password", database='test', port=3306,
            charset='utf8')
  jobs = []
  for tb_name in tb_list:
    jobs.append(gevent.spawn(mysql_to_xml, tb_name))
  gevent.joinall(jobs)

2. list_to_xml函数修改,速度提升上百倍

def list_to_xml(result_cur, key_list):
  fp = codecs.open('test.xml'), 'w', 'utf-8')
  fp.write('<?xml version="1.0" encoding="UTF-8" ?>\r\n')
  fp.write('<RECORDS>\r\n')
  for item in result_cur:
    fp.write('\t<RECORD>\r\n')
    for k in key_list:
      v = item.get(k, '')
      if v is None:
        real_value = ''
      else:
        if type(v) == unicode:
          real_value = cgi.escape(v)
        else:
          real_value = v
      fp.write('\t\t<%s>%s</%s>\r\n' % (k, real_value, k))
    fp.write('\t</RECORD>\r\n')
  fp.write('</RECORDS>\r\n')
  fp.close()

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python+MySQL数据库程序设计入门教程》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。


# Python  # 多任务  # mysql  #   # xml  # python实现的多任务版udp聊天器功能案例  # python多线程案例之多任务copy文件完整实例  # python多任务之协程的使用详解  # python多任务及返回值的处理方法  # 协程Python 中实现多任务耗资源最小的方式  # 操作技巧  # 程序设计  # 进阶  # 相关内容  # 感兴趣  # 数据结构  # 给大家  # 不支持  # 更多关于  # 所述  # 使用技巧  # 编程技巧  # 讲述了  # dom  # key_list  # result_cur  # param  # node 


相关文章: 为什么Go需要go mod文件_Go go mod文件作用说明  深圳网站制作培训,深圳哪些招聘网站比较好?  如何用免费手机建站系统零基础打造专业网站?  如何在阿里云虚拟服务器快速搭建网站?  如何快速配置高效服务器建站软件?  宝塔建站无法访问?如何排查配置与端口问题?  如何通过WDCP绑定主域名及创建子域名站点?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  上海网站制作开发公司,上海买房比较好的网站有哪些?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何续费美橙建站之星域名及服务?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  建站10G流量真的够用吗?如何应对访问高峰?  建站之星logo尺寸如何设置最合适?  内部网站制作流程,如何建立公司内部网站?  如何快速搭建自助建站会员专属系统?  ui设计制作网站有哪些,手机UI设计网址吗?  如何在宝塔面板中修改默认建站目录?  如何在阿里云通过域名搭建网站?  如何配置FTP站点权限与安全设置?  C++时间戳转换成日期时间的步骤和示例代码  如何通过虚拟主机空间快速建站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  PHP 500报错的快速解决方法  如何使用Golang table-driven基准测试_多组数据测量函数效率  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  网站制作报价单模板图片,小松挖机官方网站报价?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在IIS服务器上快速部署高效网站?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何在景安云服务器上绑定域名并配置虚拟主机?  建站为何优先选择香港服务器?  公司网站设计制作厂家,怎么创建自己的一个网站?  存储型VPS适合搭建中小型网站吗?  在线教育网站制作平台,山西立德教育官网?  如何选择适合PHP云建站的开源框架?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  建站主机选购指南与交易推荐:核心配置解析  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  大学网站设计制作软件有哪些,如何将网站制作成自己app?  建站之星后台密码如何安全设置与找回?  建站主机选购指南:核心配置优化与品牌推荐方案  黑客如何通过漏洞一步步攻陷网站服务器?  建站之星价格显示格式升级,你的预算足够吗?  子杰智能建站系统|零代码开发与AI生成SEO优化指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。