Joh*_*Doe 6 python mysql dataframe pandas pymysql
我有一个 DataFrame,它有大约 30,000 多行和 150 多列。因此,目前我正在使用以下代码将数据插入 MySQL。但是由于它一次读取一行,因此将所有行插入到 MySql 中花费了太多时间。
有什么方法可以一次或批量插入所有行?这里的限制是我只需要使用 PyMySQL,我不能安装任何其他库。
import pymysql
import pandas as pd
# Create dataframe
data = pd.DataFrame({
    'book_id':[12345, 12346, 12347],
    'title':['Python Programming', 'Learn MySQL', 'Data Science Cookbook'],
    'price':[29, 23, 27]
})
# Connect to the database
connection = pymysql.connect(host='localhost',
                         user='root',
                         password='12345',
                         db='book')
# create cursor
cursor=connection.cursor()
# creating column list for insertion
cols = "`,`".join([str(i) for i in data.columns.tolist()])
# Insert DataFrame recrds one by one.
for i,row in data.iterrows():
    sql = "INSERT INTO `book_details` (`" +cols + "`) VALUES (" + "%s,"*(len(row)-1) + "%s)"
    cursor.execute(sql, tuple(row))
    # the connection is not autocommitted by default, so we must commit to save our changes
    connection.commit()
# Execute query
sql = "SELECT * FROM `book_details`"
cursor.execute(sql)
# Fetch all the records
result = cursor.fetchall()
for i in result:
    print(i)
connection.close()
谢谢你。
尝试使用 SQLALCHEMY 创建一个引擎,然后您可以在 pandas df.to_sql 函数中使用它。此函数将行从 Pandas 数据帧写入 SQL 数据库,它比迭代数据帧和使用 MySql 游标快得多。
您的代码如下所示:
import pymysql
import pandas as pd
from sqlalchemy import create_engine
# Create dataframe
data = pd.DataFrame({
    'book_id':[12345, 12346, 12347],
    'title':['Python Programming', 'Learn MySQL', 'Data Science Cookbook'],
    'price':[29, 23, 27]
})
db_data = 'mysql+mysqldb://' + 'root' + ':' + '12345' + '@' + 'localhost' + ':3306/' \
       + 'book' + '?charset=utf8mb4'
engine = create_engine(db_data)
# Connect to the database
connection = pymysql.connect(host='localhost',
                         user='root',
                         password='12345',
                         db='book')    
# create cursor
cursor=connection.cursor()
# Execute the to_sql for writting DF into SQL
data.to_sql('book_details', engine, if_exists='append', index=False)    
# Execute query
sql = "SELECT * FROM `book_details`"
cursor.execute(sql)
# Fetch all the records
result = cursor.fetchall()
for i in result:
    print(i)
engine.dispose()
connection.close()
您可以在pandas doc 中查看此函数的所有选项
可能的改进。
现在尝试加载数据。
生成 CSV 文件并使用 ** LOAD DATA INFILE ** 进行加载 - 这将从 mysql 内部发出。