python mysql数据库导出xml_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 += '\r\n' # root节点

for item in result_cur:

content += '\t\r\n'

for k in key_list:

v = item.get(k, '')

real_value = v

content += '\t\t%s%s>\r\n' % (k, real_value, k)

content += '\t\r\n'

content += '\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('\r\n')

for item in result_cur:

fp.write('\t\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>\r\n' % (k, real_value, k))

fp.write('\t\r\n')

fp.write('\r\n')

fp.close()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值