【问题标题】:How to insert data of a list in a database properly?如何在数据库中正确插入列表数据?
【发布时间】:2022-01-19 08:48:55
【问题描述】:

我的列表如下:

col1 = ['', '8465-01-446-8616', '8465-01-538-4334', '8345-01-641-8205', '8465-01-690-3107', '8465-01-526-7827', '', '', '5120-00-097-4136', '6640-00-866-1645']

col2 = [[], ['06222'], ['0N995', '12858'
], ['58367', '58367'], ['4SEN6'], ['0CCM0'], [], [], ['82523', '8BXN8'], ['1KGE8', '725Q0']]

col3 = [[], ['MODEL 703'], ['PMBS9', 'BS-9'], ['24425HBA', '37210'], ['MA66-002'], ['03485'], [], [], ['100250', '5080'], ['09-845C', '4716E20']]


col4 = [[], [''], ['AARDVARK', 'PAULSON MANUFACTURING CORPORAT
ION'], ['WILLARD MARINE, INC.', 'WILLARD MARINE, INC.'], ['CONDOR OUTDOOR PRODUCTS, INC.'], ['CASCADE DESIGNS, INC.'], [], [], ['', 'TELEFLEX LLC'], ['FISHER SCI
ENTIFIC COMPANY L.L.C.', 'THOMAS SCIENTIFIC, LLC']]

我必须将这些数据插入数据库。

我尝试首先使用将列表列表转换为单个列表

col2 = sum(col2,[])
col3 = sum(col3,[])
col4 = sum(col4,[])

并使用转换为元组列表

records = list(zip(col1,col2,col3,col4))

记录

[('', '06222', 'MODEL 703', ''), ('8465-01-446-8616', '0N995', 'PMBS9', 'AARDVARK'), ('8465-01-538-4334', '12858', 'BS-9', 'PAULSON MANUFACTURING CORPORATION'), ('8345-01-641-8205', '58367', '24425HBA', 'WILLARD MARINE, INC.'), ('8465-01-690-3107', '58367', '37210', 'WILLARD MARINE, INC.'), ('8465-01-526-7827', '4SEN6', 'MA66-002', 'CONDOR OUTDOOR PRODUCTS, INC.'), ('', '0CCM0', '03485', 'CASCADE DESIGNS, INC.'), ('', '82523', '100250', ''), ('5120-00-097-4136', '8BXN8', '5080', 'TELEFLEX LLC'), ('6640-00-866-1645', '1KGE8', '09-845C', 'FISHER SCIENTIFIC COMPANY L.L.C.')]

此记录不匹配。

和用于插入数据库的mysql查询:

conn = mysql.connector.connect(
  host="",
  user="",
  password="",
  database=""
)
cursor = conn.cursor()

cursor.executemany ( """
INSERT INTO table(col1,col2,col3,col4)
VALUES (%s,%s,%s,%s)
""" , records )

conn.commit ()

这造成了上述数据的不匹配:

数据库中的数据应该是这样的:

,,,,
8465-01-446-8616,0622,MODEL 703,,
8465-01-538-4334,0N995,PMBS9,AARDVARK,
8465-01-538-4334,12858,BS-9,PAULSON MANUFACTURING CORPORATION
8345-01-641-8205,58367,24425HBA,WILLARD MARINE, INC.
8345-01-641-8205,58367,37210,WILLARD MARINE, INC.

所有列表列表中的单个列表链接到 col1 的元素。

如何将这些数据正确插入Mysql数据库?

数据框中所需数据的示例

col1             col2     col3      col4

8465-01-446-8616 06222  MODEL 703   
8465-01-538-4334 0N995  PMBS9      AARDVARK
8465-01-538-4334 12858  BS-9       PAULSON MANUFACTURING CORPORATION
8345-01-641-8205 58367  24425HBA   WILLARD MARINE, INC.
8345-01-641-8205 58367  37210      WILLARD MARINE, INC.

第一行是空的。

【问题讨论】:

  • 我很确定错误在于您解释数据的方式。原来的四列中的每一列都有 10 个元素,其中一些是空的。第 2 到 4 列的每个元素都是一个列表。当您执行sum(col2,[]) 时,您会展平列表,破坏原始对齐方式。此外,列 2 到 4 的长度变为 11 个元素而不是 10 个(组成每列的子列表的各种长度的影响)。您可能应该更好地了解数据的结构,并且可能接受列表作为数据库的元素
  • sum(col2,[]) 存在错误。所以我想避免这种情况,并按照预期的输出创建元组列表。
  • 我会将所有数据放在 Pandas Dataframe 中。 Pandas 有一个内置函数可以将你的 Dataframe 插入到数据库中。
  • @Herker 你能说明一下如何做吗,我也认为使用 pandas 会有所帮助
  • 我已经更新了数据框的外观

标签: python mysql list tuples mysql-python


【解决方案1】:

这应该做的工作!

必需的导入:

 import mysql.connector
 from sqlalchemy import create_engine
 import pandas as pd

连接到您的数据库:

sqlEngine = create_engine('mysql+pymysql://root:root@localhost/DATABASE NAME')
dbConnection = sqlEngine.connect()
db = mysql.connector.connect(

   host="localhost",
   user="username",
   passwd="password",
   database="database name")

mycursor = db.cursor()


col1 = ['', '8465-01-446-8616', '8465-01-538-4334', '8345-01-641-8205', '8465-01-690-3107', '8465-01-526-7827', '', '', '5120-00-097-4136', '6640-00-866-1645']

col2 = ['', '06222', '0N995', '12858', '58367', '58367', '4SEN6', '0CCM0', '', '', '82523', '8BXN8', '1KGE8', '725Q0']

col3 = ['', 'MODEL 703', 'PMBS9', 'BS-9', '24425HBA', '37210', 'MA66-002', '03485', '', '', '100250', '5080', '09-845C', '4716E20']
 
col4 = ['', 'AARDVARK', 'PAULSON MANUFACTURING CORPORATION', 'WILLARD MARINE, INC.', 'WILLARD MARINE, INC.', 'CONDOR OUTDOOR PRODUCTS, INC.', 'CASCADE DESIGNS, INC.', '', '', '', 'TELEFLEX LLC', 'FISHER SCIENTIFIC COMPANY L.L.C.', 'THOMAS SCIENTIFIC, LLC']
 
data = {
    'col1': col1,
    'col2': col2,
    'col3': col3,
    'col4': col4
}

df = pd.DataFrame.from_dict(data, orient='index')
df = df.transpose()
df.to_sql(con=sqlEngine, name="table name", if_exists='append', index=False)

transpose() 函数转置数据帧的索引和列。它通过将行写入列来反映 DataFrame 在其主对角线上,反之亦然。

【讨论】:

    猜你喜欢
    • 2017-07-24
    • 2021-04-23
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多