python中利⽤to_sql将数据插⼊MySQL数据库
python中利⽤to_sql将数据插⼊MySQL数据库
前⾔
最近需要将⼀些CSV⽂件导⼊mysql数据库中,所以需要写⼀个导⼊程序。在以前导⼊数据时利⽤pysql⼀条⼀条读取再写⼊,花费的时间特别长,最近看了解到pandas中利⽤第三⽅包导⼊速度特别快,语法也特别简单,特此记录。
1:引⼊第三⽅包
import pandas as pd
from sqlalchemy import create_engine
on the line
没有的话直接pip install 就⾏
2:读取数据、连接数据库插⼊
先上代码question1
# 需要传⼊⽤户名、登录密码、地址、数据库名、字符编码(⼀般为utf8)
aboarddata = pd.read_csv(file_path,encoding ='utf-8')
engine = create_engine("mysql+pymysql://{}:{}@{}/{}?chart={}".format('⽤户名','登录密码','127.0.0.1:3306','数据库名','字符编码'))
<_sql(name='table_name', con=engine, if_exists='append', index=Fal)
缘分有take2这样就可以将读取的⽂件直接导⼊数据库中,如果数据库中没有这张数据表会直接创建,这取决于参数if_exists,后⾯说明。
导⼊数据库的语句虽然很短,但在实际导⼊时会遇到各种各样的问题,在此说明⼀下各个参数,在create_engine函数中除了⽤户名、密码常⽤参数外,address:port是连接MySQL的ip地址和端⼝号(默认localhost:3306),数据库名是要连接的数据库,字符编码很重要,要插⼊中⽂的话使⽤utf8即可,mysql+pymysql://,这⾥是说通过pymysql这个包来连接数据库。
3:常⽤参数说明
<_sql()函数的常⽤参数
英语对话范文name: 输出的表名
con: 数据库链接
if_exits: 三个模式
fail,(默认值)若表存在,则不进⾏数据导⼊,直接退出;
replace:若表存在,覆盖原来表⾥的数据;
append:若表存在,将数据写到原表的后⾯。默认为fail
index:是否将df的index单独写到⼀列中,即需不需要索引列
index_label:指定列作为df的index输出,此时index为True
4:注意点
在使⽤这个⽅法时,经过实际测试,当数据⽂档超过1000⾏时会报错,意思是每次导⼊最多只能为1000⾏,所以当你的数据较⼤时,需要切分开来,然后分批来导⼊。
这⾥是我切分的⼀个⼩样列
ad_csv("xxxxx")
line_num=int(list(df.shape)[0]/1000+1)# 获取数据⾏数,按1000⾏划分,⽐如1234⾏,这⾥返回2
for i in range(0,line_num):
if i<line_num-1:# 当⼤于1000⾏时,取整,这⾥就是取1000⾏
data = df.iloc[1000*i:1000*i+1000,:]
engine = create_engine("mysql+pymysql://{}:{}@{}/{}?chart={}".format('⽤户名','登录密码','127.0.0.1:3306','数据库名','字符编码')) #存⼊数据库
# print("连接完毕")
<_sql(name = table_name,con = engine,if_exists ='append',index=Fal)
print("第%d/%d导⼊完毕"%(i+1,a))
if i==line_num-1:#当⼩于1000⾏,取余,这⾥就是234⾏
data = df.iloc[1000*i:1000*i+list(df.shape)[0]%1000,:]她一定是疯了翻译
abrasiveengine = create_engine("mysql+pymysql://{}:{}@{}/{}?chart={}".format('⽤户名','登录密码','127.0.0.1:3306','数据库名','字符编码')) #存⼊数据库
忧苦ou# print("连接完毕")
<_sql(name = table_name,con = engine,if_exists ='append',index=Fal)
print("第%d/%d导⼊完毕"%(i+1,a))
kuno