国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現(xiàn)簡單的多任務(wù)mysql轉(zhuǎn)xml的方法

2019-11-25 16:22:08
字體:
供稿:網(wǎng)友

本文實例講述了Python實現(xiàn)簡單的多任務(wù)mysql轉(zhuǎn)xml的方法。分享給大家供大家參考,具體如下:

為了需求導(dǎo)出的格式盡量和navicat導(dǎo)出的xml一致。

用的gevent,文件i/o操作會阻塞,所以并不會完全異步。

1. mysql2xml.py:

# -*- coding: utf-8 -*-'''Created on 2014/12/27@author: Yoki'''import geventimport pymysqlfrom pymysql.cursors import DictCursorimport reimport codecsdb_conn = Nonedef init_mysql_connect(*args, **kwargs):  global db_conn  db_conn = pymysql.connect(*args, **kwargs)def list_to_xml(result_cur, key_list):  '''  mysql 結(jié)果集轉(zhuǎn)xml,非xml標(biāo)準(zhǔn)導(dǎo)出方式; 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節(jié)點(diǎn)  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 contentdef 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 rowsdef get_table_keys(tb_name):  '''  獲取表中字段,順序 為創(chuàng)建表時的順序  :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數(shù)據(jù)導(dǎo)出xml,  :param tb_name: 數(shù)據(jù)庫表名  :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函數(shù)修改,速度提升上百倍

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()

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python+MySQL數(shù)據(jù)庫程序設(shè)計入門教程》、《Python常見數(shù)據(jù)庫操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設(shè)計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 特克斯县| 浙江省| 东乡族自治县| 徐水县| 南陵县| 西藏| 马关县| 师宗县| 民县| 襄汾县| 五大连池市| 全南县| 大悟县| 弥勒县| 西宁市| 蕲春县| 荆门市| 安阳市| 宁武县| 榆社县| 肃北| 当涂县| 万盛区| 迁安市| 德州市| 冕宁县| 务川| 青河县| 永修县| 江山市| 栾川县| 大悟县| 泰顺县| 远安县| 沙坪坝区| 含山县| 天峨县| 麦盖提县| 田阳县| 错那县| 平定县|