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

作者:toil 时间:2024-01-26 20:11:07 

本文实例讲述了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,xml
0
投稿

猜你喜欢

  • python实现线程池的方法

    2023-03-10 14:08:06
  • Innodb表select查询顺序

    2024-01-16 03:32:40
  • 简单说明Python中的装饰器的用法

    2022-01-30 21:57:32
  • Python中用pyinstaller打包时的图标问题及解决方法

    2021-11-10 01:41:33
  • SQL基础查询和LINQ集成化查询

    2024-01-18 21:51:47
  • Python实现统计单词出现的个数

    2022-11-01 12:19:30
  • 用Python在Excel里画出蒙娜丽莎的方法示例

    2023-12-18 02:59:21
  • Python3.6.0+opencv3.3.0人脸检测示例

    2023-07-23 05:51:07
  • python 解决动态的定义变量名,并给其赋值的方法(大数据处理)

    2021-10-09 10:44:58
  • python模块smtplib实现纯文本邮件发送功能

    2022-08-14 21:01:32
  • MySQL安装starting the server失败的2种解决办法(推荐!)

    2024-01-28 11:16:09
  • Vue 页面监听用户预览时间功能的实现代码

    2024-04-27 15:56:25
  • python3实现的zip格式压缩文件夹操作示例

    2023-07-31 18:17:48
  • go Cobra命令行工具入门教程

    2023-06-24 18:27:12
  • 在Python的Flask框架下使用sqlalchemy库的简单教程

    2021-02-23 23:58:40
  • 教程:打造SQL Server2000的安全策略

    2008-12-23 15:52:00
  • python中安装Scrapy模块依赖包汇总

    2023-11-08 07:06:25
  • js模态对话框使用方法详解

    2024-04-19 10:46:22
  • asp使用Application来统计在线人数方法

    2007-08-13 12:43:00
  • 科学设计你的网站网页

    2008-03-16 13:48:00
  • asp之家 网络编程 m.aspxhome.com