Загрузить файл XML в базу данных MySQL, используя python с отображением столбцов - PullRequest
0 голосов
/ 11 октября 2019

Я написал код для загрузки данных в таблицу MySQL с помощью библиотеки pymysql. Я загружаю данные в таблицу MySQL следующим образом:

    import pymysql
    con = pymysql.connect(host=host,user=user,password=passwd,db=db,port=int(port),autocommit=True,local_infile=1)
    sql = "LOAD XML INFILE '" + path + "' INTO TABLE "+ ds_name +"."+table_name +" SET dataset="+ds_name+", factor_date="+factor_date+","+column_map+ " ROWS IDENTIFIED BY '<LoanInfo>'"
    cursor.execute(sql)
    cursos.commit()

ds_name и factor_date не компилируются из XML-файла, поэтому я пишу их как статические по всем строкам.

У меня есть файл CSV / excel, который содержит сопоставление между столбцами файла XML и именем столбца таблицы MySQL для более 100 столбцов. Я где-то читал, что сопоставление ссылочного столбца можно добавить в запрос SQL как «SET ABC_AGE = @ Age, UNIQUE_ID = @ID, BALANCE = @ Money». Я создаю список сопоставлений следующим образом:

ls = []
for value in zip(map_df['XML Columns'],map_df['SQL Columns']):
    ls.append(value[0]+"=@"+value[1])
column_map = ",".join(ls)

Мой вопрос: есть ли лучший подход для загрузки XML-файла в MySQL с использованием python с сопоставлением?

column map example

1 Ответ

0 голосов
/ 14 октября 2019

Я нашел способ преобразовать xml-файл в фрейм данных pandas, а затем загрузить его с executemany в базу данных mysql. Вот фрагмент кода для преобразования xml в фрейм данных:

#reading mapping file and converting mapping to dictionary
import os
import pandas as pd
map_path = 'Mapping.xlsx'
if os.path.isfile(map_path):
    map_df = pd.read_excel(map_path,worksheet='Mapping')
    mapping_dict = pd.Series(map_df['XML Columns'].values,index=map_df['SQL columns']).to_dict()

#Reading XML file

import xml.etree.ElementTree as ET
xml_path = 'test.xml'
if os.path.isfile(xml_path):
        root = ET.parse(xml_path).getroot()

#Reading xml elements one by one and storing attributes in a dictionary.

missing_col = set()
xmldf_dict = {"df_dicts":[]}
for elem in root:
    df_dict = {}
    for k,v in mapping_dict.items():
        if k in [list of columns to skip]:
            continue
        try:
            df_dict[k] =  elem.attrib[v]
        except KeyError:
            missing_col.add(k)

    xmldf_dict["df_dicts"].append(df_dict)

#Merging missing columns dataframe with xml dataframe

missing_col_df = pd.DataFrame(columns=missing_col)
xml_df = pd.DataFrame(xmldf_dict["df_dicts"])
final_df = pd.concat([xml_df,missing_col_df],axis=1)

...