读取数据
用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