python连接oracle -- sqlalchemy

import cx_Oracle as orcl
import pandas as pd
from sqlalchemy import create_engine # 数据库连接
db = create_engine('oracle://qmcb:qmcb@localhost:1521/tqmcbdb') #查询
sql_select = ''' ...'''
df = pd.read_sql_query(sql_select, db) #执行
db.execute('truncate table {}'.format(ttb)) #保存
df.to_sql() #太慢 #插入
conn = db.raw_connection()
cursor = conn.cursor()
col = ', '.join(df.columns.tolist())
s = ', '.join([':'+str(i) for i in range(1, df.shape[1]+1)])
sql = 'insert into {}({}) values({})'.format(ttb, col, s)
cursor.executemany(sql, df.values.tolist())
conn.commit()
cursor.close()

  python连接oracle -- cx_Oracle

cx_oracle 使用

oracle 数据库表字段的缺失值统计 -- 基于python

cx_Oracle模块的安装和使用  看下连接oracle的各种方式

import cx_Oracle as orcl

#定义oracle连接
orcl.connect('load/123456@localhost/ora11g')
orcl.connect('username','password','host:port/orcl')
tnsname = orcl.makedsn('host', 'port', 'sid')
db = orcl.connect('username', 'password', tnsname) #数据库参数输出
db.autocommit = False # 关闭自动提交
orcl.clientversion()
db.version
db.ping()
db.username
db.password
db.dsn #dsn=data source name
db.tnsentry
cursor.rowcount #定义游标
#orcl.Cursor(db)
cursor = db.cursor() #查询数据 + 执行代码(如建表,清空表)
sql = "SELECT ENAME, trunc(SAL,0) FROM EMP WHERE deptno = :deptno and sal > :value"
cursor.execute(sql, deptno = 30, value = 1000)
dict1 = {'deptno':30, 'sal':3000}
cursor.execute(sql, dict1)
cursor.execute(sql) #
cursor.fetchone()
cursor.fetchall()
cursor.fetchmany(10) #查10条数据 #插入数据
#mysql自带load data infile 'D:/../...txt' into table user(var1, ., .)
cursor.execute('insert into demo(v) values(:1)',['nice'])
data = [['a',1], ['b',2], ...]
cursor.executemany(sql, data) #查询列名
columns = [i[0] for i in cursor.description] #出错回滚 -- 一般如插入数据时出错回滚, try:...except:db.rollback()
db.rollback() #关闭数据库
cursor.close()
db.close()

  定义ConnectOracle对象

import cx_Oracle as orcl
class ConnectOracle:
#scott xx 192.168.32.200 1521 oracle
#sqlplus, system as sysdba, select instance_name from V$instance;
#oracle://qmcbrt:qmcbrt@localhost:1521/tqmcbdb
#cx_Oracle.connection('hr', 'hrpwd', 'localhost:1521/XE')
##cx_Oracle.connection('qmcb:qmcb@localhost:1521/tqmcbdb')
def __init__(self, username, passwd, host, port='1521', sid='oracle'):
# dsn = data source name
self.login = {}
self.db = None
self.cursor = None
self.login['username'] = username
self.login['passwd'] = passwd
self.login['dsn'] = orcl.makedsn(host, port, sid)
print(orcl.clientversion()) def connect_oracle(self):
try:
#orcl.connect('load/123456@localhost/ora11g')
#orcl.connect('username','password','host/orcl')
self.db = orcl.connect(self.login['username'], self.login['passwd'], self.login['dsn']) # 登录内搜数据库
self.db.autocommit = False # 关闭自动提交
#orcl.Cursor(self.db)
self.cursor = self.db.cursor() # 设置cursor光标
#print(self.db.dsn)
#print(self.db.password)
#print(self.db.ping())
#print(self.db.tnsentry)
#print(self.db.username);
#print(self.db.version)
#print(self.cursor.rowcount)
return True
except:
print('can not connect oracle')
return False def close_oracle(self):
self.cursor.close()
self.db.close() def select_oracle(self, sql, size=0, params=None):
if self.connect_oracle():
if params:
# 执行多条sql命令
# results = cur.executemany("select field from table where field = %s", ('value1', 'value2', 'value3'))
#sql = "SELECT ENAME, trunc(SAL,0) FROM EMP \
# WHERE deptno = :deptno and sal > :value"
#cursor.execute(sql, deptno = 30, value = 1000);
#params = {'deptno':30, 'sal':3000}
#cur.execute(sql, params)
self.cursor.executemany(sql, params)
else:
self.cursor.execute(sql)
if size:
content = self.cursor.fetchmany(size)
else:
content = self.cursor.fetchall() # 字段名
#ss = sql.lower()
#find默认查找从左向右第一个位置
#string = sql[ss.find('select'), ss.find('from')]
columns = [i[0] for i in self.cursor.description]
self.close_oracle()
#if len(content)==1:
# return pd.Series(content[0], index=columns)
return pd.DataFrame(content, columns=columns)
return False def insert_oracle(self, sql, data=None):
try:
self.connect_oracle()
if data:
# 批量插入, [(),..]、((),..)
# mysql自带load data infile 'D:/../...txt' into table user(var1, ., .)
#self.cursor.execute('insert into demo(v) values(:1)',['nice'])
self.cursor.executemany(sql, data)
else:
self.cursor.execute(sql, data)
except:
print("insert异常")
self.db.rollback() # 回滚
finally:
self.db.commit() # 事务提交
self.close_oracle()

  定义读取oracle函数

def read_db(orcl_engien, ftb, snum, enum):
db = create_engine(orcl_engien) #不需要close()
query_sql = '''
select *
from {}
where
row_num > {} and
row_num <= {} and
is_normal='1' and
is_below_16='0' and
is_xs='0' and
is_cj='0' and
is_bzsw='0' and
is_dc='0' and
is_px='0'
'''.format(ftb, snum, enum)
return pd.read_sql_query(query_sql, db)

  定义connectOracle

class ConnectOracle:
def __init__(self, username, passwd, host, port='1521', sid='oracle'):
# dsn = data source name
self.login = {}
self.db = None
self.cursor = None
self.login['username'] = username
self.login['passwd'] = passwd
self.login['dsn'] = orcl.makedsn(host, port, sid)
print(orcl.clientversion()) def connect(self):
try:
#orcl.connect('load/123456@localhost/ora11g')
self.db = orcl.connect(self.login['username'], self.login['passwd'], self.login['dsn']) # 登录内搜数据库
self.db.autocommit = False # 关闭自动提交
self.cursor = self.db.cursor() # 设置cursor光标
return True
except Exception as e:
print(e)
return False def close(self):
self.cursor.close()
self.db.close() def execute(self, sql, params=None):
try:
if params:
self.cursor.execute(sql, params)
else:
self.cursor.execute(sql)
return True
except Exception as e:
print(e)
self.db.rollback()
return False def select(self, sql, size=0, params=None):
if self.connect():
if self.execute(sql):
if size:
data_list = self.cursor.fetchmany(size)
else:
data_list = self.cursor.fetchall()
columns = [i[0].lower() for i in self.cursor.description]
#if len(content)==1:
# return pd.Series(content[0], index=columns)
df = pd.DataFrame(data_list, columns=columns)
return df
else:
print('代码执行错误')
self.close()
else:
print('数据库连接错误')
return None def insert(self, sql, data=None):
if self.connect():
try:
if data:
if isinstance(data[0], (list,tuple,)):
self.cursor.executemany(sql, data)
else:
self.cursor.execute(sql, data)
else:
self.cursor.execute(sql)
except Exception as e:
print(e)
print("insert异常")
self.db.rollback() #回滚
finally:
self.db.commit() #事务提交
self.close()
else:
print('数据库连接错误')

  定义插入oracle函数

import retry

#backoff=1, jitter=0, , logger=retry.logging
@retry.retry(exceptions=Exception, tries=5, delay=5, backoff=1, max_delay=10)
def insert_db(data, orcl_engien, ttb):
# dtyp = {col:types.VARCHAR(df[col].str.len().max())
# for col in df.columns[df.dtypes == 'object'].tolist()}
# 太慢!!
#dtyp = {'aac147':types.VARCHAR(18),'score':types.NUMBER(6,2)}
#return data.to_sql(ttb, con=db, dtype=dtyp, if_exists='append', index=False)
#output = io.StringIO()
#data.to_csv(output, sep='\t', index=False, header=False)
#output.getvalue()
#output.seek(0)
db = create_engine(orcl_engien) #不需要close()
conn = db.raw_connection()
#db = cx_Oracle.connect(orcl_engien[9:])
cursor = conn.cursor()
#cursor.copy_from(output, ttb, null='')
col = ', '.join(data.columns.tolist())
s = ', '.join([':'+str(i) for i in range(1, data.shape[1]+1)])
sql = 'insert into {}({}) values({})'.format(ttb, col, s)
#TypeError: expecting float,
cursor.executemany(sql, data.values.tolist())
conn.commit()
cursor.close()
#try:
#except Exception as e:
# print(e)
#finally:

  定义重试装饰器

#定义一个重试修饰器,默认重试一次
def retry(num_retries=1, delay=2, random_sec_max=3):
#用来接收函数
import time
import numpy as np
def wrapper(func):
#用来接收函数的参数
def wrapper(*args,**kwargs):
#为了方便看抛出什么错误定义一个错误变量
#last_exception =None
#循环执行包装的函数
for _ in range(num_retries):
try:
#如果没有错误就返回包装的函数,这样跳出循环
return func(*args, **kwargs)
except Exception as err:
#捕捉到错误不要return,不然就不会循环了
#last_exception = e
#np.random.randint(0,random_sec_max+1,size=10)
time.sleep(delay + np.random.random()*random_sec_max)
print(err)
else:
#如果要看抛出错误就可以抛出
# raise last_exception
raise 'ERROR: 超过retry指定执行次数!!'
print('未执行参数为:', *args, **kwargs)
return wrapper
return wrapper

  

python 连接oracle -- sqlalchemy及cx_Oracle的使用详解的更多相关文章

  1. python 连接oracle数据库:cx_Oracle

    注意:64位操作系统必须安装64位oracle客户端,否则会连接报错 安装第三方库:cx_Oracle 一.连接数据库的三种方式: 1.cx_Oracle.connect('账号/密码@ip:端口/数 ...

  2. python 连接 oracle 统计指定表格所有字段的缺失值数

      python连接oracle -- qlalchemy import cx_Oracle as co import pandas as pd from sqlalchemy import crea ...

  3. python 连接 Oracle 乱码问题(cx_Oracle)

    用python连接Oracle是总是乱码,最后发现时oracle客户端的字符编码设置不对. 编写的python脚本中需要加入如下几句: import os os.environ['NLS_LANG'] ...

  4. Python连接Oracle数据查询导出结果

    python连接oracle,需用用到模块cx_oracle,可以直接pip安装,如网络不好,可下载离线后本地安装 cx_oracle项目地址:https://pypi.org/project/cx_ ...

  5. Python 连接 Oracle数据库

    1.环境设置 [root@oracle ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@oracle ~]# python - ...

  6. Python 连接Oracle数据库

    连接:python操作oracle数据库  python——连接Oracle数据库 python模块:cx_Oracle, DBUtil 大概步骤: 1. 下载模块 cx_Oracle (注意版本) ...

  7. Python连接oracle数据库 例子一

    step1:下载cx_Oracle模块,cmd--pip install cx_Oracle step2: 1 import cx_Oracle #引用模块cx_Oracle 2 conn=cx_Or ...

  8. python连接oracle导出数据文件

    python连接oracle,感觉table_list文件内的表名,来卸载数据文件 主脚本: import os import logging import sys import configpars ...

  9. python连接Oracle的方式以及过程中遇到的问题

    一.库连接步骤 1.下载cx_Oracle模块 下载步骤 工具 pycharm :File--->右键setting--->找到Project Interpreter  -----> ...

随机推荐

  1. 201871010135 张玉晶 《面向对象程序设计(java)》 第一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/wyt0455820/ ...

  2. Java程序猿怎么才能月薪过万?

    每一个略微有点长进的人,都应该把作业里的前三名作为自己斗争的政策和对手.你离成为冠军Java程序员还有多远,看完这篇你就知道了. 软件工程师的作业生涯里,知识有一个三年的半衰期.这意味着三年后,你所具 ...

  3. ccf再卖菜

    https://blog.csdn.net/imotolove/article/details/82777819 记忆化搜索,还不太理解..

  4. Centos7源码编译安装PHP7.2(生产环境)

    安装PHP依赖包,否则在编译的过程中可能会出现各种报错 # Centos 安装epel-release源并将系统包更新到最新版本 $ yum install epel-release-y $ yum ...

  5. 第04组 Beta冲刺(4/5)

    队名:new game 组长博客 作业博客 组员情况 鲍子涵(队长) 过去两天完成了哪些任务 地图移动 接下来的计划 素材和脚本相连 引入声音素材 还剩下哪些任务 让游戏本体运行 遇到了哪些困难 时间 ...

  6. Python连载51-网络编程基础知识

    一.网络编程 1.网络.网络协议(一套规则) 2.网络模型: (1)七层模型-七层 物理层(比如网线.锚).数据链路层(比如电压电流).网络层.传输层.会话层.表示层.应用层(我们的活动基本都在这一层 ...

  7. iOS: 本地通知的前后变化(iOS10)

    一.介绍  通知和推送是应用程序中很重要的组成部分.本地通知可以为应用程序注册一些定时任务,例如闹钟.定时提醒等.远程推送则更强大,提供了一种通过服务端主动推送消息到客户端的方式,服务端可以更加灵活地 ...

  8. 手把手教你如何用 OpenCV + Python 实现人脸检测

    配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like Haar-like百科释义.通俗的来讲 ...

  9. 通过 SCQA 的框架来讲故事

    SCQA:Situation情景.Complication冲突.Question疑问. Answer回答   SCQA模型是一个"结构化表达"工具,是麦肯锡咨询顾问芭芭拉·明托在& ...

  10. Netty—TCP的粘包和拆包问题

    一.前言 虽然TCP协议是可靠性传输协议,但是对于TCP长连接而言,对于消息发送仍然可能会发生粘贴的情形.主要是因为TCP是一种二进制流的传输协议,它会根据TCP缓冲对包进行划分.有可能将一个大数据包 ...