首頁  >  文章  >  後端開發  >  Python實作簡單的多任務mysql轉xml的方法

Python實作簡單的多任務mysql轉xml的方法

高洛峰
高洛峰原創
2017-02-10 09:51:261819瀏覽

這篇文章主要介紹了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 += &#39;<?xml version="1.0" encoding="UTF-8" ?>\r\n&#39;
  content += &#39;<RECORDS>\r\n&#39; # root节点
  for item in result_cur:
    content += &#39;\t<RECORD>\r\n&#39;
    for k in key_list:
      v = item.get(k, &#39;&#39;)
      real_value = v
      content += &#39;\t\t<%s>%s</%s>\r\n&#39; % (k, real_value, k)
    content += &#39;\t</RECORD>\r\n&#39;
  content += &#39;</RECORDS>\r\n&#39;
  return content
def get_table_rows(tb_name):
  &#39;&#39;&#39;
  获取mysql表rows
  :param tb_name:
  :return:
  &#39;&#39;&#39;
  global db_conn
  rows = []
  cursor = db_conn.cursor(cursor=DictCursor)
  cursor.execute(&#39;select * from %s&#39; % tb_name)
  for row in cursor:
    rows.append(row)
  return rows
def get_table_keys(tb_name):
  &#39;&#39;&#39;
  获取表中字段,顺序 为创建表时的顺序
  :param tb_name:
  :return:
  &#39;&#39;&#39;
  global db_conn
  cursor = db_conn.cursor(cursor=DictCursor)
  cur = cursor.execute(&#39;show create table %s&#39; % tb_name)
  if cur != 1:
    raise Exception
  for r in cursor:
    create_sql = r[&#39;Create Table&#39;]
    fields = re.findall(&#39;`(.*?)`&#39;, 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=&#39;xml&#39;, postfix=&#39;xml&#39;):
  &#39;&#39;&#39;
  mysql数据导出xml,
  :param tb_name: 数据库表名
  :param output_dir:
  :param postfix:
  :return:
  &#39;&#39;&#39;
  rows = get_table_rows(tb_name)
  keys = get_table_keys(tb_name)
  content = list_to_xml(rows, keys)
  fp = codecs.open(&#39;%s/%s.%s&#39; % (output_dir, tb_name, postfix), &#39;w&#39;, &#39;utf-8&#39;)
  fp.write(content)
  fp.close()
tb_list = [
  &#39;tb_item&#39;,
  &#39;tb_state&#39;
]
if __name__ == &#39;__main__&#39;:
  init_mysql_connect(host="localhost", user=&#39;user&#39;, password="password", database=&#39;test&#39;, port=3306,
            charset=&#39;utf8&#39;)
  jobs = []
  for tb_name in tb_list:
    jobs.append(gevent.spawn(mysql_to_xml, tb_name))
  gevent.joinall(jobs)


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

mye PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn