(1)下载cx_Oracle:
需保证系统版本,python版本,oracle客户端的版本,cx_Oracle的版本的一致性。oracle客户端的版本,cx_Oracle的版本,要与Python版本和位数对应。
Python版本:Python3.4.3 32位;
cx_Oracle的版本:cx_Oracle-5.2-11g.win32-py3.4
oracle客户端的版本:instantclient-basic-win32-11.2.0.1.0;
这里还有三个注意点:
版本位数对应,都是32位;
cx_Oracle和python版本对应,都是3.4;
cx_Oracle和instantclient版本对应,都是11;
(2)查看Python版本:win+R——cmd——python
(3)安装cx_Oracle:pip install cx-Oracle
或者去官网下载安装:https://pypi.org/project/cx-Oracle/#files
(4)下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
把下载的文件解压,复制oci.dll,oraocci11.dll,oraociei11.dll的3个DLL粘贴到你的python安装目录的Libs/site-packages文件夹下面。
import cx_Oracle #导入oracle数据库
class ReadDB:
# 定义连接对象,类方法
conn=None
#指定数据库配置文件
dsn = open(r'D:\PLSQL Developer\instantclient\instantclient_11_3\NETWORK\ADMIN\tnsnames.ora')
# 获取连接对象方法封装
def get_conn(self):
if self.conn is None:
self.conn = cx_Oracle.connect(user="登录名",
password="密码password",
dsn="ORACLE_40.31",
encoding="UTF-8")
return self.conn # 返回连接对象
def get_sql_one(self, sql,params):
# 定义游标对象及数据变量
sursor = None
data = None
try:
# 获取游标对象
sursor = self.get_cursor()
# 调用执行方法
sursor.execute(sql,params)
# 获取结果
data = sursor.fetchone()
#-------输出结果加入字段名
des=sursor.description # 获取表详情,字段名,长度,属性等
t=",".join([item[0] for item in des])
table_head = t.split(',') # # 查询表列名 用,分割
dict_result = dict(zip(table_head,data)) # 打包为元组的列表 再转换为字典
list_result = []
list_result.append(dict_result) # 将字典添加到list_result中
print( "查询结果如下:\n", list_result, end='\n')
except Exception as e:
print("get_sql_one error:", e)
finally:
# 关闭游标对象
self.close_cursor(sursor)
# 关闭连接对象
self.close_conn()
# 返回执行结果
return list_result
pip install --upgrade --user --default-timeout=1500 pandas(python安装目录下)
import pandas
# ------------------------获取所有数据结果集-------------------------
def get_sql_all(self, sql,params):
# 定义游标对象及数据变量
global table_head
sursor = None
data = None
data_count = 0
try:
# 获取游标对象
sursor = self.get_cursor()
# 调用执行方法
sursor.execute(sql,params)
# 获取所有结果
data = sursor.fetchall()
#-----------------输出结果对应表字段
for i in data:
list_list = list(i)
des = sursor.description # 获取表详情,字段名,长度,属性等
t = ",".join([item[0] for item in des])
table_head = t.split(',') # # 查询表列名 用,分割
dict_result = dict(zip(table_head, list_list)) # 打包为元组的列表 再转换为字典
list_result = []
list_result.append(dict_result) # 将字典添加到list_result中
# --------表格形式输出
pandas.set_option('display.max_columns', None) # 最大显示的列数
pandas.set_option('display.max_row', None) # 最大显示的行数
pandas.set_option('display.max_colwidth', 100) # 每一列的最大显示宽度,当列中的数据超过指定长度时就会以省略号代替。而它的单位则是像素
pandas.set_option('display.width', 5000) # 控制,可以不换行
#-------列名对齐(有中文字符)
pandas.set_option('display.unicode.ambiguous_as_wide', True)
pandas.set_option('display.unicode.east_asian_width', True)
delist = pandas.DataFrame(list_result) # 制作表格,key作为列索引
# ---------判断字段长度(根据长度显示输出)
h = list(list_list)
if len(h) > 10:
#-----输出结果对应表字段
print("字段数:", len(h), ",第" + str(data_count + 1) + "条查询结果如下:\n", list_result, end='\n')
data_count += 1 #计算循环次数+1
else:
#-----输出结果为表格形式
print("字段数:", len(h),"数据结果如下:\n", delist, end='\n')
break #退出循环
except Exception as e:
print("get_sql_all error:", e)
finally:
# 关闭游标对象
self.close_cursor(sursor)
# 关闭连接对象
self.close_conn()
# 返回执行结果
return data
示例代码:read_oracle.py
import datetime
import os.path
import cx_Oracle #导入oracle数据库
import pandas #pip install --upgrade --user --default-timeout=1500 pandas(scripts)
from _DBconnent.frozen_dir import app_path
class ReadDB:
global log
# 定义连接对象,类方法
conn=None
#dsn = open(r'D:\PLSQL Developer\PLSQL Developer\instantclient\instantclient_11_3\NETWORK\ADMIN\tnsnames.ora')
path = app_path()
#--------------冻结路径的程序代码(判断路径是否存在)-------------------
if os.path.exists(path + r'\tnsnames.ora'): #检测目录文件是否存在
file = path + r'\tnsnames.ora' # 冻结路径的程序代码
print(datetime.datetime.now(),'导入Oracle目录:',file)
print("日志目录:",path + r'\log.txt')
log = open(path + r'\log.txt', 'a+')
log.writelines(str(datetime.datetime.now()) + " 导入Oracle目录:" + file + '\n')
dsn=open(file,'r')
elif os.path.exists(path + r'\_DBconnent'):
file = path + r'\_DBconnent\tnsnames.ora' # 冻结路径的程序代码
print(datetime.datetime.now(),'导入Oracle目录:', file)
log = open(path + r'\log\log.txt', 'a+')
log.writelines(str(datetime.datetime.now()) + " 导入Oracle目录:" + file + '\n')
dsn = open(file, 'r')
else:
os.makedirs(path)
# 获取连接对象方法封装
def get_conn(self):
if self.conn is None:
self.conn = cx_Oracle.connect(user="登录名",
password="密码",
dsn="ORACLE_40.31",
encoding="UTF-8")
return self.conn # 返回连接对象
# 获取游标对象封装
def get_cursor(self):
return self.get_conn().cursor()
# 关闭游标对象封装
def close_cursor(self, cursor):
if cursor:
cursor.close()
# 关闭游标对象封装
def close_conn(self):
if self.conn:
self.conn.close()
# 注意:关闭连接对象后,对象还存在内存中,需要手工设置为None
self.conn = None
# 主要执行方法->在外界调用次方法就可以完成数据相应操作:
#------------------获取一条数据结果集------------------
def get_sql_one(self, sql,params):
# 定义游标对象及数据变量
sursor = None
data = None
data_count=0
try:
# 获取游标对象
sursor = self.get_cursor()
# 调用执行方法
sursor.execute(sql,params)
# 获取结果
data = sursor.fetchone()
#-------输出结果加入字段名
des=sursor.description # 获取表详情,字段名,长度,属性等
t=",".join([item[0] for item in des])
table_head = t.split(',') # # 查询表列名 用,分割
dict_result = dict(zip(table_head,data)) # 打包为元组的列表 再转换为字典
list_result = []
list_result.append(dict_result) # 将字典添加到list_result中
print( "查询结果如下:\n", list_result, end='\n')
except Exception as e:
print("get_sql_one error:", e)
finally:
# 关闭游标对象
self.close_cursor(sursor)
# 关闭连接对象
self.close_conn()
# 返回执行结果
return list_result
# -------------------获取 所有数据结果集-----------------
def get_sql_all(self, sql):
# 定义游标对象及数据变量
sursor = None
data = None
data_count = 0
try:
# 获取游标对象
sursor = self.get_cursor()
# 调用执行方法
sursor.execute(sql)
# 获取所有结果
data = sursor.fetchall()
# -------获取字段名
for i in data:
list_list = list(i)
des = sursor.description # 获取表详情,字段名,长度,属性等
t = ",".join([item[0] for item in des])
table_head = t.split(',') # # 查询表列名 用,分割
dict_result = dict(zip(table_head, list_list)) # 打包为元组的列表 再转换为字典
list_result = []
list_result.append(dict_result) # 将字典添加到list_result中
# --------表格形式输出
pandas.set_option('display.max_columns', None) # 最大显示的列数
pandas.set_option('display.max_row', None) # 最大显示的行数
pandas.set_option('display.max_colwidth', 199) # 每一列的最大显示宽度,当列中的数据超过指定长度时就会以省略号代替。而它的单位则是像素
pandas.set_option('display.width', None) # 控制,可以不换行
# 列名对齐(有中文字符)
pandas.set_option('display.unicode.ambiguous_as_wide', True)
pandas.set_option('display.unicode.east_asian_width', True) #设置输出右对齐
delist = pandas.DataFrame(list(data),columns=list(table_head),index=None) # 制作表格,data为表值,columns为列索引,index为行索引(none为默认)
#print("数据结果如下:\n", "-"*150,'\n', delist, end='\n')
#display(delist)
#print(delist.head(1)) # 返回前n行
#print(delist.tail(1)) # 显示后n行
#print(tabulate(list(data),headers=table_head,tablefmt='simple')) #tablefmt是设置表格形式,fancy_grid
# ---------判断字段长度(根据长度显示输出)
h = list(list_list)
if len(h) > 10:
print("字段数:",len(h),",第"+str(data_count+1)+"条查询结果如下:\n", list_result, end='\n')
data_count += 1
else:
print("字段数:", len(h),"数据结果如下:\n", delist, end='\n')
break
except Exception as e:
print("get_sql_all error:", e)
finally:
# 关闭游标对象
self.close_cursor(sursor)
# 关闭连接对象
self.close_conn()
# 返回执行结果
return list_result
#------------------------------ 修改 删除 新增----------------------
def update_sql(self, sql,params):
# 定义游标对象及数据变量
sursor = None
data = None
try:
# 获取游标对象
sursor = self.get_cursor()
# 调用执行方法
sursor.execute(sql,params)
# 提交事务
self.conn.commit()
print("数据更新成功!")
except Exception as e:
# 事务回滚
self.conn.rollback()
print("get_update error:", e)
finally:
# 关闭游标对象
self.close_cursor(sursor)
# 关闭连接对象
self.close_conn()
# 返回执行结果
return data
示例代码:text.py
from _DBconnent.read_oracle import ReadDB #连接yst_manager数据库
sql="select t.agt_merc_id,t.agt_merc_nm,t.f_term_no,t.f_device_sn,t.merc_id,t.merc_nm,t.reg_flg,t.is_active,t.pledge_state," \
"t.pledge_id,t.comp_cb_id,t.cashback_policy,t.comm_rule_id,t.cash_end_time,t.org_cash_end_time from " \
"yst_manager.t_cipher_code t where t.agt_merc_id='8011121000003WY' and merc_id is null order by t.f_import_time desc"
ReadDB().get_sql_all(sql) #调用执行