将DataFrame直接打入到mysql的一个表中

问题描述

在项目实战中,会有将一个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")

可以使用 pandas 库中的 to_sql() 方法将 DataFrame 中的某一列插入到 MySQL 表中。具体操作如下: 1. 首先,需要安装 MySQL Connector Python 库,可以使用以下命令进行安装: ``` pip install mysql-connector-python ``` 2. 然后,连接到 MySQL 数据库,可以使用以下代码: ``` import mysql.connector # 建立连接 cnx = mysql.connector.connect(user='username', password='password', host='hostname', database='database_name') ``` 3. 接着,将 DataFrame 中的某一列转换为 MySQL 表中的一列,可以使用以下代码: ``` import pandas as pd # 读取 DataFrame df = pd.read_csv('data.csv') # 将 DataFrame 中的某一列转换为 MySQL 表中的一列 column_name = 'column_name' column_data_type = 'VARCHAR(255)' # 列的数据类型 df[column_name] = df[column_name].astype(str) # 将列的数据类型转换为字符串类型 df[column_name] = df[column_name].apply(lambda x: x.replace("'", "''")) # 将列中的单引号替换为两个单引号,避免 SQL 注入攻击 # 将 DataFrame 中的某一列插入到 MySQL 表中 table_name = 'table_name' df[[column_name]].to_sql(name=table_name, con=cnx, if_exists='append', index=False, dtype={column_name: column_data_type}) ``` 其中,name 参数指定要插入的表名,con 参数指定 MySQL 数据库连接对象,if_exists 参数指定如果表已经存在时的操作,index 参数指定是否将 DataFrame 的索引插入到表中,dtype 参数指定列的数据类型。 注意,如果要插入的表不存在,需要先创建表,并指定列的数据类型。例如: ``` cursor = cnx.cursor() create_table_query = ''' CREATE TABLE table_name ( column_name VARCHAR(255) ) ''' cursor.execute(create_table_query) cursor.close() ``` 这样,就可以将 DataFrame 中的某一列插入到 MySQL 表中了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值