pandas DataFrame读写数据库:Oracle、sqlite3

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

pandas DataFrame读写数据库:Oracle、sqlite3_第1张图片


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)

你可能感兴趣的:(#,Pandas,oracle,big,data,数据库)