Python: MySQLへのアクセス、XMLの出力

a0002_009631

以前「F#: MySQLへのアクセス、XMLの出力」「F#: XMLの出力 (一部修正)」で、MySQLにアクセスしてXMLを出力する、というプログラムをF#で書いてみる、ということを書いたのですが、それと同じことをPythonでやってみようかと。
きっかけは、MySQLへのアクセス〜XML出力までをMacの世界で閉じてやりたくなったから、というところ。まぁMonoを使えば動かせるかもしれませんけど、ちょっと環境を整える余力もなかったので(笑)

あまり真新しいところはないと思いますが、とりあえずコードをどうぞ。

# -*- coding: utf-8 -*-

from xml.etree.ElementTree import Element, SubElement, tostring
import MySQLdb
import sys

def create_horseinfo(cur, ketto_toroku_bango):
    sql = 'SELECT ketto_toroku_bango,bamei,b.content,c.content,seinengappi,' \
        + 'd.content,chokyoshimei_ryakusho,ketto1_bamei,ketto2_bamei,' \
        + 'ketto5_bamei ' \
        + 'FROM jvd_kyosoba_master a ' \
        + 'JOIN jvd_seibetsu_code b ON a.seibetsu_code=b.code ' \
        + 'JOIN jvd_moshoku_code c ON a.moshoku_code=c.code ' \
        + 'JOIN jvd_tozai_shozoku_code d ON a.tozai_shozoku_code=d.code ' \
        + 'WHERE ketto_toroku_bango=%s'
    cur.execute(sql, (ketto_toroku_bango,))
    row = cur.fetchone()

    sql = 'SELECT a.kaisai_nengappi,b.content,c.kyosomei_ryakusho_6,' \
        + 'd.content,e.content,f.content,c.kyori,a.kishumei_ryakusho,' \
        + 'a.futan_juryo,a.kakutei_chakujun,a.tansho_ninkijun,c.shusso_tosu,' \
        + 'a.tansho_odds,a.soha_time,a.kohan_3f,g.content,h.content,' \
        + 'a.aite1_bamei,a.time_sa ' \
        + 'FROM jvd_umagoto_race_joho a ' \
        + 'JOIN jvd_keibajo_code b ON a.keibajo_code=b.code ' \
        + 'JOIN jvd_race_shosai c ON a.race_code=c.race_code ' \
        + 'JOIN jvd_kyoso_joken_code d ' \
        + 'ON c.kyoso_joken_code_saijakunen=d.code ' \
        + 'JOIN jvd_grade_code e ON c.grade_code=e.code ' \
        + 'JOIN jvd_track_code f ON c.track_code=f.code ' \
        + 'JOIN jvd_babajotai_code g ON c.shiba_babajotai_code=g.code ' \
        + 'JOIN jvd_babajotai_code h ON dirt_babajotai_code=h.code ' \
        + 'WHERE ketto_toroku_bango=%s AND c.data_kubun in ("7","A","B") ' \
        + 'ORDER BY kaisai_nengappi DESC'
    cur.execute(sql, (ketto_toroku_bango,))
    rows = cur.fetchall()

    raceinfos = []
    for row_race in rows:
        raceinfos.append({'kaisai_nengappi': row_race[0],
                          'keibajo': row_race[1], 'name': row_race[2],
                          'joken': row_race[3], 'grade': row_race[4],
                          'track': row_race[5], 'kyori': row_race[6],
                          'kishumei': row_race[7], 'futan': row_race[8],
                          'chakujun': row_race[9], 'ninki': row_race[10],
                          'tosu': row_race[11], 'odds': row_race[12],
                          'time': row_race[13], 'agari3f': row_race[14],
                          'shiba': row_race[15], 'dirt': row_race[16],
                          'aite': row_race[17], 'timesa': row_race[18]})

    return {'bango': row[0], 'bamei': row[1], 'seibetsu': row[2],
            'moshoku': row[3], 'seinengappi': row[4], 'shozoku': row[5],
            'chokyoshi': row[6], 'sire': row[7], 'broodmare': row[8],
            'bms': row[9], 'race': raceinfos}

if __name__ == '__main__':
    horseinfos = []

    with MySQLdb.connect(host='XXXXX', db='XXXXX',
                         user='XXXXX', passwd='XXXXX) as cur:
        for horsenumber in sorted(sys.argv[1:]):
            horseinfo = create_horseinfo(cur, horsenumber)
            horseinfos.append(horseinfo)

    root = Element('HorseList')
    for horseinfo in horseinfos:
        seinengappi = horseinfo['seinengappi'].strftime('%Y-%m-%d')
        horseelm = SubElement(root, 'Horse',
                              {'KettoTorokuBango': horseinfo['bango'],
                               'Bamei': horseinfo['bamei'],
                               'Seibetsu': horseinfo['seibetsu'],
                               'Moshoku': horseinfo['moshoku'],
                               'Seinengappi': seinengappi,
                               'Shozoku': horseinfo['shozoku'],
                               'Chokyoshi': horseinfo['chokyoshi'],
                               'Sire': horseinfo['sire'],
                               'BroodMare': horseinfo['broodmare'],
                               'BMS': horseinfo['bms']})
        if len(horseinfo['race']) > 0:
            races = SubElement(horseelm, 'Races')
            for race in horseinfo['race']:
                kaisainengappi = race['kaisai_nengappi'].strftime('%Y-%m-%d')
                SubElement(races, 'Race',
                           {'Kaisainengappi': kaisainengappi,
                            'Keibajo': race['keibajo'],
                            'Name': race['name'],
                            'Joken': race['joken'],
                            'Grade': race['grade'],
                            'Track': race['track'],
                            'Kyori': str(race['kyori']),
                            'Kishumei': race['kishumei'],
                            'Futan': str(race['futan']),
                            'Chakujun': str(race['chakujun']),
                            'Ninki': str(race['ninki']),
                            'Tosu': str(race['tosu']),
                            'Odds': str(race['odds']),
                            'Time': str(race['time']),
                            'Agari3F': str(race['agari3f']),
                            'Shiba': race['shiba'],
                            'Dirt': race['dirt'],
                            'Aite': race['aite'],
                            'Timesa': str(race['timesa'])})

    print tostring(root, 'utf-8')

F#で書いた時はMySQLから取ってきたデータをクラスに突っ込んで、ということをやっていましたが、今回は手を抜いて辞書に突っ込むことにしました。F#でも同じような作りにした方が却ってすっきりしてたかもしれませんね。

スポンサーリンク

フォローする

スポンサーリンク