Maison > développement back-end > Tutoriel Python > Python implémente une méthode mysql multitâche simple vers XML

Python implémente une méthode mysql multitâche simple vers XML

高洛峰
Libérer: 2017-02-10 09:51:26
original
1840 Les gens l'ont consulté

Cet article présente principalement la méthode de conversion de mysql multitâche simple en XML en Python et analyse les compétences opérationnelles associées de l'ensemble de résultats mysql de requête Python pour convertir la sortie de données au format XML sous forme d'exemples. à cela

L'exemple de cet article décrit comment implémenter un simple mysql multitâche en XML en Python. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Afin de répondre aux exigences, le format exporté doit être cohérent avec le XML exporté par Navicat.

Lors de l'utilisation de gevent, les opérations d'E/S sur les fichiers seront bloquées, elles ne seront donc pas complètement asynchrones.

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)
Copier après la connexion


2. Modification de la fonction List_to_xml, vitesse augmentée de centaines de fois


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

Pour plus d'articles connexes sur la façon d'implémenter un simple mysql multitâche en XML en Python, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal