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