问题描述
在项目实战中,会有将一个excel存入到mysql数据库,或者将redis中的一个key的数据存入mysql数据库的情况
解决方案
方案一
最让人能想到的方案是,读取excel或者key的值,转成DataFrame格式,先建好对应的表结构,循环DataFrame的每一行,执行insert插入语句,即可完成需求,因为必不可免的会涉及到建表,写insert的sql语句,循环还会耗费一定的时间,虽然简单易实现,但是效率可能低下哎,有方法可以改善吗?回答是肯定的,有!
方案二(重要)
python给我们提供了强大的各种库,pd.io.sql.to_sql
完美的解决了我们的问题,它可以将DataFrame直接转化成mysql的表,不需要我们建表,不需要我们循环,不需要我们写插入的sql语句,不过我们得首先安装第三方库sqlalchemy,直接上代码!
需要注意的是,数据库密码的末尾不能有@,因为链接键中密码与数据库地址是连接在一起的,是使用@进行识别链接数据库的ip的地址的
import pandas as pd
from sqlalchemy import create_engine
# 创建了一个mysql的工具类,方便使用
# df_write_mysql -> DataFrame write into mysql xx database xx table function
class MySQLUtil:
# host:ip地址,port:端口号,username:用户名,password:密码,db:数据库名,table:表名
def __init__(self, host, port, username, password, db, table):
self.host = host
self.port = port
self.username = username
self.password = password
self.db = db
self.table = table
# write_mode:操作方式 方式有:append,fail,replace
#append:如果表存在,则将数据添加到表后面
#fail:如果表存在就不操作
#replace:如果表存在,删了,覆盖重建
self.write_mode = 'append'
# 链接键格式 mysql+pymysql://用户名:密码@数据库地址/数据库名?charset=utf8’
self.connect_url = 'mysql+pymysql://' + username + ':' + password + '@' + host + ':' + port + '/' + db + '?charset=utf8'
self.mysql_connect = create_engine(self.connect_url)
def df_write_mysql(self, data):
# 参数设置:DataFrame 表名 链接键 数据库名 操作方式 是否录入索引
pd.io.sql.to_sql(data, self.table, self.mysql_connect, schema=self.db, if_exists=self.write_mode, index=False)
print("write into mysql finish")