数据分析师需要经常从数据库中取数据进行分析,MySQL数据库是较为常用的关系型数据库,python是目前火热的数据分析语言,在python中,利用第三方库直接对数据库进行操作,包括数据的读取和写入等,能极大提高数据分析师的工作效率。本文介绍利用PyMySQL和SQLAlchemy两个python库对MySQL数据库进行读写操作。
1 软件版本
Win10 64bit Python 3.8 PyCharm 2019.3.4 PyMySQL 0.9.3 SQLAlchemy 1.3.16 2 安装库
需要安装
PyMySQL
和SQLAlchemy
两个库,在终端中用pip
命令进行安装,如下:pip install PyMySQL pip install SQLAlchemy
3 PyMySQL读写数据库
脚本如下:
import pymysql import pandas as pd if __name__ == '__main__': # 创建数据库连接(需要修改) con = pymysql.connect(host='xxx', port=3306, user='xxx', password='xxx', db='xxx', charset="utf8") # 创建游标(默认数据返回tuple,修改为dict) cur = con.cursor(cursor=pymysql.cursors.DictCursor) # 读取表 get_sql = "select * from tb_newCity" # sql语句 cur.execute(get_sql) # 执行sql语句 get_df = pd.DataFrame(cur.fetchall()) # 获取结果转为dataframe print(get_df) # 创建表 create_sql = 'create table if not exists new(id int,value double)' cur.execute(create_sql) # 写入表(数据库中必须存在该表) df = pd.DataFrame({'id': [1, 2], 'value': [12, 13]}) insert_sql = 'insert into new (id,value) values (%s,%s)' # %s占位符 # 1.循环执行 for i in range(df.__len__()): # 插入的数据类型需要与数据库中字段类型保持一致 cur.execute(insert_sql, (int(df.iloc[i, 0]), float(df.iloc[i, 1]))) # 2.批量执行 cur.executemany(insert_sql, [df.iloc[0].to_list(), df.iloc[1].to_list()]) # 提交所有执行命令 con.commit() print('数据写入成功!') cur.close() # 关闭游标 except Exception as e: raise e finally: con.close() # 关闭连接
连接及游标: 创建数据库连接时,需要根据实际情况修改主机 host
、端口port
,用户名user
,密码password
,数据库db
参数。端口 port
默认值是3306,设置charset
为utf8
,解决读取中文问题。默认游标返回的查询数据格式是 tuple
,通过修改游标类型可以控制返回数据格式。用游标 cur
的execute()
方法运行sql语句完成表的读取。调用游标 cur
的fetchall()
方法可以获取全部的查询数据。此外,fetchone()
方法获取第一条数据,fetchmany(n)
方法获取前n条数据。写入表时,需要保证数据库中存在该表,可以先创建该表。 用sql语句完成写入表的操作,sql语句中可以先用 %s
表示占位符,在执行语句中再用具体值替换。pandas的dataframe类型数据写入数据库中,可以用循环 execute()
或采用executemany()
实现。写入数据库中的数据必须与数据库中定义的字段类型保持一致,不一致时可以进行转换。 创建表和写入表操作,需要最后用 commit()
方法提交,才算完成操作。运行脚本,输出如下:
con = create_engine("mysql+pymysql://user:password@host:port/db") # 读取表 sql = 'select * from t_json' # sql语句 get_df = pd.read_sql_query(sql, con) # 结果为dataframe print(get_df) # 写入表 df = pd.DataFrame({'id': [1, 2], 'value': [12, 13]}) df.to_sql('new', con, if_exists='append', index=False) print('数据写入成功!') except Exception as e: raise e创建数据库引擎
con
时,需要根据实际情况修改主机host
、端口port
,用户名user
,密码password
,数据库db
参数。调用pandas的
read_sql_query
方法运行sql语句完成表的读取。pandas的dataframe对象可以直接写入数据库,调用
if_existsto_sql
方法即可,数据库中无该表时,会自动创建表,无需先建表。其中的if_exists
参数控制写入行为,具体解释如下: