第一次用pycharm运行python语句,第一次从Oracle读数据,出现了无数的bug。。把过程记录一下以提升效率
1.数据读取并处理成dataframe格式:用逐行查询的方式
import cx_Oracleimport pandas as pdimport numpy as np#连接数据库db = cx_Oracle.connect('用户名','密码','位置')# 获取游标cr= db.cursor()#查询数据并形成数据表def get_df_from_sqldata(sql): #sql放sql语句cr = db.cursor()cr.execute(sql)rs = cr.fetchall()columnDes = cr.descriptioncolumnNames = [colunmDes[i][0] for i in range(len(columnDes))]df = pd.DataFrame([list(i) for i in rs], columns = columnNames)return df
2.SQL语句在Oracle中运行无误,但在python中报错“未找到要求的from关键字”,主要是一些小问题,比如多了逗号, 没加空格之类
我的问题在于where条件前面没有加上空格
网上还有一些问题,eg 查询的字段另起的中文名字中出现了各种不符合规则的字符,比如:/ 、\ - :这些字符,除此之外,中文名字过长,也会出现这种问题。
3.“ORA-00942: 表或视图不存在”,
原因一是自己起的表命没有全部大写。Oracle是大小写敏感的,在python中名字是小写的,执行代码Oracle就找不到了。。
原因二是调用的主表名不对。用以下语句查找表所属数据库:
select * from all_tables t where t.TABLE_NAME = upper(‘已知指标所在的表名’)
4.oracle not supported error: python处理的数据类型与Oracle中数据类型需要一一对应,不然没法写进Oracle。
参考:python与oracle(三)数据类型
这里需要用到显示DataFrame数据类型的代码
print(df.dtypes)
int32没法写进number类型列,需要在写入Oracle的语句前加int()
5.模糊查询与表拼接
select t.指标一, c.* from smdbgdata.CD_Macroindicator c,smdbgdata.C_ED_macroIndicatorData c where t.indicatorname like ‘%美国国债%’ and t.indicatorcode = c.indicatorcode and c.enddate >sysdate-10
6.建同义词与授权:有时候要跨库查询
Create public synonym 表名 for 库1.表名;
grant DELETE,INSERT,SELECT,UPDATE on 库1.表名 to 库2;
7.选取部分字段
substr(A.s_info_windcode,1,instr(a.s_info_windcode,’.’,1,1)-1)
8.更改日期格式
to_char(to_date(c.time,‘YYYY-MM-DD’),‘YYYYMMDD’) = A.TRADE_DT
9.groupby有问题:有股票被放进符合要求(非st pt股,上市时间>180天,A股)的股票列表,但在查询的时间区间内数据非整型,只有某几天有数据。
目前的解决方法是把出问题的天拿出来按股票代码循环,找出有问题的代码,在查询数据时删掉
10.跑循环有时候不知道跑到第几个,需要从Oracle里读最新日期看一下。
select *from FOF_STOCK_ETOP T order by T.TIME DESC