IDE: spyder(anaconda)
数据库: oracle
pandas不仅可以从本地文件读取数据,也可以从数据库中直接读取。
从Oracle读:
1. 首先导入需要的包:
import pandas
import cx_Oracle
from sqlalchemy import create_engine
2. 再根据你自己的数据库情况,填入参数,基本格式为:
connect = create_engine('oracle://username:password@post:host/sid')
3. 然后写入sql语句,并用read_sql方法把数据读入到DataFrame:
# 这是个例子
sql = "select * from table"
df = pd.read_sql(sql, connect)
我在实际运行的时候,从数据库中读入数据花了将近一个小时,数据量有点大。不知道有没有解决的方法(猜测和网速慢也有关系)
写入Oracle:
补充sql语句:
删除表:drop table xxx
删除表中的数据:truncate table xxx
写入数据库的方法和读取的方法大同小异:
# 这只是个例子
import pandas
import cx_Oracle
from sqlalchemy import create_engine
from sqlalchemy.dlalects.oracle import VARCHAR2, DATE
# 创建连接
connect = create_engine('oracle://username:password@post:host/sid')
# 指定默认格式
dtypedict = {'NAME':VARCHAR2(20)}
# table_name是表名 index=False表示不把索引插入表
pd.to_sql('table_name', connect, index=False, if_exists='append', dtype=dtypedict)
踩过的坑:
Oracle:ORA-00911: 无效字符:
sql语句在编写的时候最后不能有;
解决办法:把分号去掉
Oracle:ORA-12505 :listener does not currently know of SID given in connect descriptor…
SID设置错了,先来查看一下SID是什么。
做法:在PL/SQL中执行下面的sql语句来进行查询,然后把程序里的SID修改一下就好了
select instance_name from v$instance
ORA-01861: 文字与格式字符串不匹配
日期与字符串互转问题。
发生在我试图写入DATE类型的数据到oracle时,暂时没找好好的解决办法,偷懒把该字段按照VARCHAR2来指定格式了- -
ORA-00906:缺失左括号
指定默认格式的时候对于需要限定长度的字段没有限定
在括号内指定长度即可
dtypedict = {'NAME':VARCHAR2(20)}
DPI-1015:array size of xxx is too large
dataframe比较大,指定一下参数:chunksize=100
写入sqlite3:
import pandas as pd
import sqlite3
# 创建数据库链接 找到对应的sqlite3文件
conn = sqlite3.connect(r'-----此处填你的路径----\db.sqlite3')
# dataframe 对象
my_df = pd.read_csv(r'------举个例子----\11.csv')
# my_table是数据库中的表名
lanxi_data_all.to_sql('mytable',con=conn,if_exists='append',index=False)