【python】PyMySQL和pandas操作数据库

目录

使用PyMySQL模块操作数据库

使用pandas进一步操作数据库

to_sql()把DataFrame数据存回数据库


使用PyMySQL模块操作数据库

下载并安装pymysql模块。

使用connect()函数连接到数据库。host、port为连接本地MYSQL数据库的IP和端口。user、password为登录本地MYSQL的账号和密码。database指定读取哪个数据库。charest设置数据编码。

import pymysql
conn = pymysql.connect(host='128.0.0.1', port=3306, user='root', password='11111', database='test', charset='utf8')

创建游标,用于与数据库之间交互的对象。pymysql模块提供返回元组类型数据和返回字典类型数据的两种游标。

# 返回元组类型的游标
cursor = conn.cursor()
# 返回字典类型的游标
cursor_dict = conn.cursor(pymysql.cursors.DictCursor)

使用excute()执行SQL命令,执行insert、delete、update等改变数据库数据的SQL语句时,在excute()后需要commit()提交事务。同时最好配合try-catch异常抓获语句使用,以便出错时可以rollback()回滚事务。

执行excute()后返回受该SQL影响的数据的条数,执行SQL返回的数据存放在游标cursor中。

执行fetchone()可以从cursor中取出一条数据,fetchmany()可以指定取出数据的条数(取出多条数据)。

import pymysql
conn = pymysql.connect(host='128.0.0.1', port=3306, user='root', password='11111', database='test', charset='utf8')

# 创建游标
cursor = conn.cursor(pymysql.curosrs.DictCursor)

name = '小明'
sql = 'SELECT * FROM student WHERE name=%s'    # 构造SQL
result = cursor.execute(sql, (name))    # 在execute中拼接SQL提高安全性
# result为该SQL影响的数据记录的条数,此时取出的数据在cursor中
data = cursor.fetchalll()    # 读取数据
cursor.close()    # 关闭游标
conn.close()    # 关闭连接

使用pandas进一步操作数据库

pymysql取出来的数据只有元组或字典类型。使用pandas模块的read_sql_query()可以把取出来的数据转为DataFrame模式。

但是read_sql_qurey()需要传入指定数据库的连接引擎,由SQLAlchemy模块的create_engine()函数搭配PyMySQL模块构造连接引擎。注意create_engine()的构造格式

import pandas as pda
import pymysql
from sqlalchemy import create_engine

#构造连接引擎
# 最前面mysql指定构造数据库类型
# 接着传入数据库驱动://数据库用户名root:密码@服务器IP:端口/数据库名?连接选项
conn = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utr8')

#读取数据
# 指定num列作为行标签
data = pad.red_sql_query(sql='SELECT * FROM student', con=con, index_col=['num'])

与直接使用pymysql模块相比,本方法取出的数据为DataFrame格式方便后续的分析处理。对数据的增删改操作不同commit,可以直接生效。

另外还提供了read_sql_table和read_sql()同样用于操作数据库的函数。


to_sql()把DataFrame数据存回数据库

pandas模块提供了to_sql()把DataFrame数据直接写入数据库,不需要数据库中有对应的数据表。可以添加dtype参数指定数据类型,否则使用默认字段。

除了name指定数据库表,con指定连接引擎,还有一些可能用到的参数:

if_exists当表存在时的操作。replace 替换原表,append在原表后追加,fail 写入失败抛出异常
chunksize指定一次写入的记录条数
index默认True,把DataFrame的行标签作为字段写入表
index_label指定行标签写入表后的字段名
import pandas as pda
import pymysql
from sqlalchemy import create_engine

#构造连接引擎
conn = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utr8')

# 读取数据
data = pad.red_sql_query(sql='SELECT * FROM student', con=con, index_col=['num'])

# 写入数据
data.to_sql(name='new_student', con=con, index=True, index_label=['学号'], if_existse='replace')

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值