将许多不同的数据点插入 SQL 的 Python 方式?

问题描述 投票:0回答:1

我正在尝试找出使用

pymysql
将数据插入 SQL 的最佳(即不易出错)方法。 数据是从Excel文件中迭代提取的,每个Excel文件中提取的数据类型(即SQL字段)有多种。

我可以想到两种选择来做到这一点,但都不是特别优雅。

序言:

import mysql.connector
mydb = mysql.connector.connect(
  host="localhost",
  user="me",
  password="my_pw",
  database="myDB"
)

# Make a cursor for the DB
mc = myDB.cursor()
mc.execute('CREATE TABLE table (field_1 INT, field_2 INT, field_3 INT, Unique_iD VARCHAR(255))'

选项 1:将值放入元组中,然后迭代地将元组插入到列表中。使用

executemany()

更新 SQL 表
list_of_tuples = [(1,2,3,'uid_1'), (4,5,6,'uid_2')]

sql = """UPDATE table SET field_1=%s, field_2=%s, field_3=%s WHERE Unique_iD=%s"""
mc.executemany(sql, list_of_tuples)
mydb.commit()

选项 1 的缺点是它要求元组的顺序完全正确,这可能会造成混乱。然而,与下面的选项 2 相比,它相当简单。

选项 2:将数据存储为字典列表,其中每个字典仅包含一个字段:数据点以及唯一的 iD

my_dict_list = [{'field_1':1, 'Unique_iD':'uid_1'}, {'field_2':2, 'cell_iD':'uid_1'}, {'field_3':3, 'cell_iD':'uid_1'},{'field_1':4, 'Unique_iD':'uid_2'}, {'field_2':5, 'cell_iD':'uid_2'}, {'field_3':6, 'cell_iD':'uid_2'}]

for pos in my_dict_list:
    col = list(pos.keys())[0]
    val = list(pos.values())[0]
    iD = pos['cell_iD']
    
    sql = f'UPDATE table SET {col}={val} WHERE Unique_iD={iD}'
    mc.execute(sql)
    mc.commit()

这似乎不太可能导致错误,因为只有在字段名称与键匹配并且 Unique_iD 同时与 uid 匹配时才会发生插入,但是字典列表很快就会变得非常大。

在将数据插入 SQL 表之前是否有更好的方法来收集/组织数据?

python mysql pymysql
1个回答
0
投票

将数据加载为自动标准化表,我建议使用这个库来推断模式、输入数据并进行模式演变https://pypi.org/project/dlt/

您甚至可以使用此库对结构化数据进行更新插入,这是一个示例,我们使用 json 中的 id 来更新在目的地生成的 sql 表

data = [{'id': 1, 'name': 'John'}]

# open connection
pipe = dlt.pipeline(destination='duckdb',
                    dataset_name='raw_data')

# Upsert/merge: Update old records, insert new
# Capture the outcome in load info
load_info = pipe.run(data,
                      write_disposition="merge",
                      primary_key="id",
                      table_name="users")
© www.soinside.com 2019 - 2024. All rights reserved.