pandas直接从数据库读写数据

读取数据

用python从数据库读取数据,一般都会使用专门的数据库连接包,然后使用 cursor,比如连接mysql:

import pymysql
conn=pymysql.connect('localhost',port=3306,user='root',passwd=123,db='test')
cursor=conn.cursor()
cursor.execute(sql)
result=cursor.fetchall()   
cursor.close()
conn.close()

然后再将 result 通过 pd.DataFrame(list(result)) 转换成 DataFrame。
在返回的数据量很小的情况下,可以直接使用pandas中的 read_sql_query读取数据,得到的结果就是 DataFrame,省去了从cursor 转换为DataFrame。

import pandas as pd
import pymysql
conn=pymysql.connect('localhost',port=3306,user='root',passwd='test',db='test')
result=pd.read_sql(sql,conn)
#或者
result=pd.read_sql_query(sql,conn)

pandas.read_sql
(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

pandas.read_sql_table
(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)

pandas.read_sql_query
(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)

写入数据

使用cursor写入数据:

for i in result.index:
    cur.execute("insert into test(id,name) values (%s,%s)" ,tuple(result.loc[i]))
conn.commit()
#推荐使用以下方法:
values=[]
for i in person_lable.index:
        values.append(tuple(result.loc[i]))
cur.executemany("insert into test(id,name) values (%s,%s)" ,values)
conn.commit()

DataFrame直接写入到数据库,需要使用sqlalchemy 包:

import sqlalchemy
import pymysql
engine = sqlalchemy.create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8')
result.to_sql(result,engine,if_exists='append')

sqlalchemy.create_engine用一个字符串表示连接信息:
‘数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名’。
关于sqlalchemy的更多信息自己搜索吧。

DataFrame.to_sql
(name, con, flavor=None, schema=None, if_exists=’fail’, index=True, index_label=None, chunksize=None, dtype=None)
if_exists有三个参数{‘fail’, ‘replace’, ‘append’}, 默认‘fail’;
数据量很大的话可以设置chunksize。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html#pandas.read_sql

    原文作者:zhilaizhiwang
    原文地址: https://www.jianshu.com/p/3d797335f467
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞