pandas 读写sql数据库
如何从数据库中读取数据到DataFrame中?pandas提供这这样的接口完成此工作——read_sql()。下面我们用离子来说明这个方法。
-
我们要从sqlite数据库中读取数据,引入相关模块
-
read_sql接受两个参数,一个是sql语句,这个你可能需要单独学习;一个是con(数据库连接)、read_sql直接返回一个DataFrame对象
-
打印一下,可以看到已经成功的读取了数据
-
我们还可以使用index_col参数来规定将那一列数据设置为index
-
结果输出为:
-
当然,我们可以设置多个index,只要将index_col的值设置为列表
-
输出结果为:
-
写入数据库也很简单,下面第二句用于删除数据库中已有的表"weather_2012",然后将df保存到数据库中的"weather_2012"表
-
假如我们使用的是mysql数据库也没问题,我们只需要建立与mysql的连接即可,用下面的con代替上面的con可以达到的效果相同。
补充:
(1)DateFrane 可以将结果转换成DataFrame
import pandas as pd import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db1') cursor = conn.cursor() # cursor.execute("DROP TABLE IF EXISTS test")#必须用cursor才行 sql = "select * from user" df = pd.read_sql(sql,conn,) aa=pd.DataFrame(df) print aa
(2)存储
pd.io.sql.write_frame(df, "user_copy", conn)#不能用已经移除
pd.io.sql.to_sql(piece, "user_copy", conn,flavor='mysql',if_exists='replace')#必须制定flavor='mysql'
#!/usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db1') cursor = conn.cursor() # cursor.execute("DROP TABLE IF EXISTS user_copy")#必须用cursor才行 sql = "select * from user" df = pd.read_sql(sql,conn,chunksize=2) for piece in df: aa=pd.DataFrame(piece) # pd.io.sql.write_frame(df, "user_copy", conn)#不能用已经移除 pd.io.sql.to_sql(piece, "user_copy", conn,flavor='mysql',if_exists='replace')#必须制定flavor='mysql'
(3)根据条件添加一列数据
piece['xb'] = list(map(lambda x: '男' if x == '123' else '女', piece['pwd']))
(4)如果有汉字,链接时必须知道字符类型 charset="utf8"
(5)最后实现代码(迭代读取数据,根据一列内容新增一列,)
#!/usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db1',charset="utf8") cursor = conn.cursor() # cursor.execute("DROP TABLE IF EXISTS user_copy")#必须用cursor才行 sql = "select * from user" df = pd.read_sql(sql,conn,chunksize=2) for piece in df: # pd.io.sql.write_frame(df, "user_copy", conn)#不能用已经移除 piece['xb'] = list(map(lambda x: '男' if x == '123' else '女', piece['pwd'])) print(piece) pd.io.sql.to_sql(piece, "user_copy", conn,flavor='mysql',if_exists='append')#必须制定flavor='mysql'
(7)sqlalchemy链接 需要制定一些中文 create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/jd?charset=utf8", max_overflow=5)
# 用sqlalchemy链接 from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/db1?charset=utf8") sql = "select * from user" df = pd.read_sql(sql,engine,chunksize=2) for piece in df: print(piece) pd.io.sql.to_sql(piece, "user_copy", engine, flavor='mysql', if_exists='append')