由于産品營運部需要采用第三方個推平台,來推送消息。如果手動一個個鍵入字段和字段值,容易出錯,且非常繁瑣,需要将mysql的資料轉換為json資料,直接複制即可。
本文将涉及到如何使用Python通路Mysql資料庫及讀取擷取資料(前提需要安裝MySQLdb第三方庫哦),以及如何将資料轉換為json資料,最後儲存成檔案輸出。
代碼如下:注釋比較詳細了。
#coding=utf-8
'''Created on 2016-10-26
@author: Jennifer
Project:讀取mysql資料庫的資料,轉為json格式'''
importjson,MySQLdbdefTableToJson():try:#1-7:如何使用python DB API通路資料庫流程的
#1.建立mysql資料庫連接配接對象connection
#connection對象支援的方法有cursor(),commit(),rollback(),close()
conn = MySQLdb.Connect(host='mysql伺服器位址',user='使用者名',passwd='密碼',db='資料庫名稱',port=3306,charset = 'utf8')#2.建立mysql資料庫遊标對象 cursor
#cursor對象支援的方法有execute(sql語句),fetchone(),fetchmany(size),fetchall(),rowcount,close()
cur =conn.cursor()#3.編寫sql
sql = "SELECT pm.name AS nm,pm.desc AS dc,pm.image_url AS iu,pm.image_type AS it, pm.on_going AS og, pm.type AS mt,pm.pkgName AS pn,pm.apk_url AS du,pm.apkMd5 AS am,pm.minversionCode AS mc,pm.versionCode AS vc,pm.versionName AS vn, pm.signatureMd5 AS sm,pm.source AS se,pm.action AS ao FROM message pm WHERE pm.id = '217'"
#4.執行sql指令
#execute可執行資料庫查詢select和指令insert,delete,update三種指令(這三種指令需要commit()或rollback())
cur.execute(sql)#5.擷取資料
#fetchall周遊execute執行的結果集。取execute執行後放在緩沖區的資料,周遊結果,傳回資料。
#傳回的資料類型是元組類型,每個條資料元素為元組類型:(('第一條資料的字段1的值','第一條資料的字段2的值',...,'第一條資料的字段N的值'),(第二條資料),...,(第N條資料))
data =cur.fetchall()print u'fetchall()傳回的資料:',data#6.關閉cursor
cur.close()#7.關閉connection
conn.close()
jsonData=[]#循環讀取元組資料
#将元組資料轉換為清單類型,每個條資料元素為字典類型:[{'字段1':'字段1的值','字段2':'字段2的值',...,'字段N:字段N的值'},{第二條資料},...,{第N條資料}]
for row indata:
result={}
result['nm'] =row[0]
result['dc'] = row[1]
result['iu'] = row[2]
result['it'] = str(row[3])
result['og'] = str(row[4])
result['mt'] = str(row[5])
result['pn'] = row[6]
result['du'] = row[7]
result['am'] = row[8]
result['mc'] = str(row[9])
result['vc'] = str(row[10])
result['vn'] = row[11]
result['sm'] = row[12]
result['se'] = str(row[13])
result['ao'] = str(row[14])
jsonData.append(result)print u'轉換為清單字典的原始資料:',jsonDataexcept:print 'MySQL connect fail...'
else:#使用json.dumps将資料轉換為json格式,json.dumps方法預設會輸出成這種格式"\u5377\u76ae\u6298\u6263",加ensure_ascii=False,則能夠防止中文亂碼。
#JSON采用完全獨立于語言的文本格式,事實上大部分現代計算機語言都以某種形式支援它們。這使得一種資料格式在同樣基于這些結構的程式設計語言之間交換成為可能。
#json.dumps()是将原始資料轉為json(其中單引号會變為雙引号),而json.loads()是将json轉為原始資料。
jsondatar=json.dumps(jsonData,ensure_ascii=False)#去除首尾的中括号
return jsondatar[1:len(jsondatar)-1]if __name__ == '__main__':#調用函數
jsonData =TableToJson()print u'轉換為json格式的資料:',jsonData#以讀寫方式w+打開檔案,路徑前加r,防止字元轉義
f = open(r'D:\getui\getuidata.txt','w+')#寫資料
f.write(jsonData)#關閉檔案
f.close()
執行結果:(注代碼上方列印的資料為了友善檢視資料,可屏蔽,最終json資料會儲存在txt檔案中)
fetchall()傳回的資料: ((u'\u5377\u76ae\u6298\u6263', u'\u5377\u76ae\u6298\u6263', u'http://域名/push/push_d701df5f48c727df46c847fa912993cf.jpg', 3L, 0L, 1L, u'com.juanpi.ui', u'http://域名/apk_1476871813.apk', u'301e757dc6669ecc95ffaaae13bb096d', 14L, 64L, u'4.1.2', u'd1e536a6a60f414700cf3c86f28719c2', 3L, 2L),)
轉換為清單字典的原始資料: [{'vc': '64', 'nm': u'\u5377\u76ae\u6298\u6263', 'mc': '14', 'og': '0', 'am': u'301e757dc6669ecc95ffaaae13bb096d', 'iu': u'http://域名/push/push_d701df5f48c727df46c847fa912993cf.jpg', 'it': '3', 'vn': u'4.1.2', 'dc': u'\u5377\u76ae\u6298\u6263', 'mt': '1', 'ao': '2', 'sm': u'd1e536a6a60f414700cf3c86f28719c2', 'du': u'http://域名/apk_1476871813.apk', 'pn': u'com.juanpi.ui', 'se': '3'}]
轉換為json格式的資料: {"vc": "64", "nm": "卷皮折扣", "mc": "14", "og": "0", "am": "301e757dc6669ecc95ffaaae13bb096d", "iu": "http:/域名/push/push_d701df5f48c727df46c847fa912993cf.jpg", "it": "3", "vn": "4.1.2", "dc": "卷皮折扣", "mt": "1", "ao": "2", "sm": "d1e536a6a60f414700cf3c86f28719c2", "du": "http://域名/apk_1476871813.apk", "pn": "com.juanpi.ui", "se": "3"}