安装cx_Oracle模块和Oracle客户端:
1.直接使用pip install cx_Oracle
在线安装cx_Oralce模块,或者:
从PyPI下载cx_Oralce包后进入包所在目录后用pip install cx_Oracle
离线安装。
2.从Oracle官网下载对应操作系统版本的客户端(驱动) instantclient-basic-nt-12.2.0.1.0.zip,直接下完整版,别下精简版,可能会有意想不到的错误。安装方法下载页面上有介绍:把下载的包解压后添加环境变量就可以了。不过同时还需要Visual Studio 2013 redistributable支持,一并安装成功后就可以使用了。
建立Oracle连接 查询数据:
import cx_Oracle #引用模块cx_Oracle
conn=cx_Oracle.connnet('用户名/密码@IP或者服务器域名:端口号/服务名') #连接数据库
cursor=conn.cursor() #获取游标
result=cursor.execute(sql查询字符串) #使用cursor进行各种操作
data=result.fetchone() #获取一行数据
data=result.fetchall() #获取所有数据
data=result.fetchmany(行数) #获取多行数据
cursor.close() #关闭cursor
conn.close() #关闭连接
重点来了,查询条件中需要比较一个时间字段的数据,如何编写sql字符串:
假如有下面这个查询
sql='select 字段名 from 数据表名 where occur_time>str_time'
其中occur_time
是日期时间型,那么str_time
怎么写。
首先这个查询sql是以字符串的形式传给服务器的,因此str_time
同样是字符串。
对于这种情况,SQL语名中提供了一个方法to_date(str_time)
。
实例:查询最近30分钟的数据
#引用模块cx_Oracle和datetime
import cx_Oracle,datetime
#连接数据库
conn=cx_Oracle.connnet('用户名/密码@IP或者服务器域名:端口号/服务名')
#获取游标
cursor=conn.cursor()
#生成30分钟前的时间的字符串,注意前后再加上一个单引号'
str_time="'"+str(datetime.datetime.now()-datetime.timedelta(minutes=30))+"'"
#生成sql语句
sql="select cur from datasheet where occur_time>to_date(substr(%s,1,19),'yyyy-mm-dd hh24:mi:ss')"%(str_time)
#使用cursor进行查询操作
result=cursor.execute(sql)
#获取所有数据(最近30分钟的)
data=result.fetchall()
#关闭cursor
cursor.close()
#关闭连接
conn.close()
特别提示:
由于str(datetime.datetime.now())
生成的时间是这样的一个字符串:2019-04-16 17:02:57.033483
,而我们数据库里的occur_time
是这样的:2019-04-16 17:02:57
由19个字符组成,所以需要使用substr(%s,1,19)
截取正确的时间。
由于substr(%s,1,19)
处理的是字符串,用变量str_time
替换后应该是这样:substr('2019-04-16 17:02:57',1,19)
,这也就是为什么必须在前后加上单引号的原因了:str_time="'"+str(datetime.datetime.now()-datetime.timedelta(minutes=30))+"'"
,否则将会是这样的:substr(2019-04-16 17:02:57,1,19)
,这就明显不对了有没有。