Python实现简单的多任务mysql转xml的方法
本文实例讲述了Python实现简单的多任务mysql转xml的方法。分享给大家供大家参考,具体如下:
为了需求导出的格式尽量和navicat导出的xml一致。
用的gevent,文件i/o操作会阻塞,所以并不会完全异步。
1.mysql2xml.py:
#-*-coding:utf-8-*-
'''
Createdon2014/12/27
@author:Yoki
'''
importgevent
importpymysql
frompymysql.cursorsimportDictCursor
importre
importcodecs
db_conn=None
definit_mysql_connect(*args,**kwargs):
globaldb_conn
db_conn=pymysql.connect(*args,**kwargs)
deflist_to_xml(result_cur,key_list):
'''
mysql结果集转xml,非xml标准导出方式;xmldom不支持相同名字的node
:paramresult_cur:
:paramkey_list:
:return:
'''
content=''
content+='<?xmlversion="1.0"encoding="UTF-8"?>\r\n'
content+='<RECORDS>\r\n'#root节点
foriteminresult_cur:
content+='\t<RECORD>\r\n'
forkinkey_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'
returncontent
defget_table_rows(tb_name):
'''
获取mysql表rows
:paramtb_name:
:return:
'''
globaldb_conn
rows=[]
cursor=db_conn.cursor(cursor=DictCursor)
cursor.execute('select*from%s'%tb_name)
forrowincursor:
rows.append(row)
returnrows
defget_table_keys(tb_name):
'''
获取表中字段,顺序为创建表时的顺序
:paramtb_name:
:return:
'''
globaldb_conn
cursor=db_conn.cursor(cursor=DictCursor)
cur=cursor.execute('showcreatetable%s'%tb_name)
ifcur!=1:
raiseException
forrincursor:
create_sql=r['CreateTable']
fields=re.findall('`(.*?)`',create_sql)
result=[]
#处理字段
foriinxrange(1,len(fields)):
field=fields[i]
iffieldinresult:
continue
result.append(field)
returnresult
return[]
defmysql_to_xml(tb_name,output_dir='xml',postfix='xml'):
'''
mysql数据导出xml,
:paramtb_name:数据库表名
:paramoutput_dir:
:parampostfix:
: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=[]
fortb_nameintb_list:
jobs.append(gevent.spawn(mysql_to_xml,tb_name))
gevent.joinall(jobs)
2.list_to_xml函数修改,速度提升上百倍
deflist_to_xml(result_cur,key_list):
fp=codecs.open('test.xml'),'w','utf-8')
fp.write('<?xmlversion="1.0"encoding="UTF-8"?>\r\n')
fp.write('<RECORDS>\r\n')
foriteminresult_cur:
fp.write('\t<RECORD>\r\n')
forkinkey_list:
v=item.get(k,'')
ifvisNone:
real_value=''
else:
iftype(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数据库程序设计入门教程》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《PythonSocket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。