Python处理Oracle数据库的学习过程
Python处理Oracle数据库的学习过程
背景
产品数据存在一些大小写敏感的数据迁移到不敏感的数据库时出现报错的情况.
基于此, 我这边跟帅男同学学习了下Python的使用.
因为这一块一直比较菜.所以想着进行一下总计和备忘. 
感谢帅男提供的支持与帮助.
环境安装
https://download.jetbrains.com.cn/python/pycharm-community-2023.1.1.exe
下载最新的社区版.
理论上现在初学, 不需要使用企业版的高级特性. 
安装使用就可以了.
建议可以使用 python 比较新的版本 pip 有比较新
https://www.python.org/ftp/python/3.11.3/python-3.11.3-amd64.exe
# 这个网站下载速度非常慢.
设置project 以及安装部分pip包
这次因为仅是初学, 只学习了 configparse 和 jaydebeapi 还有 datetime 的 三个pip包.
安装方式为:
第一 先命令行修改 pip 的源到国内, 不然速度非常慢
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
第二 右上角 齿轮按钮 点击进入 setting 进入 project 进入 Python Interpreter
点击 + 就可以进行添加.
新增代码设置
点击Project 的名字, 然后点击新增python 文件就可以了. 
可以输入命令进行处理 最简单的hello world
print("hello world")
在当前页面邮件 run 就可以了
读写数据库的设置
# coding=utf-8
# 设置编码格式
import jaydebeapi
import configparser
import datetime
# 引入需要的包
config = configparser.ConfigParser()
# 定义配置对象
config.read('zhaobsh.ini',encoding='utf-8')
# 读取配置文件
jdbcString = config.get('Info','jdbcString')
driverPath = config.get('Info','driverPath')
urlString = config.get('Info','urlString')
userName = config.get('Info','userName')
passWord = config.get('Info','passWord')
# 注意 Info 为 zhaobsh.ini 里面 [Info] 指定的配置节下的内容
fname = open('zhaobsh.txt','w',encoding='utf-8')
fnamesql = open('zhaobs.sql','w',encoding='utf-8')
# 注意打开同py目录下的一个文件, 可以写入, 编码格式是utf-8
fname.write(jdbcString + " " + driverPath)
# 可以尝试写入一个内容验证是否可以. 
conn = jaydebeapi.connect(jdbcString,urlString,[userName,passWord],driverPath)
# 设置数据库连接
cur = conn.cursor()
getdatasql = "select table_name,column_name from zhaobsh003"
# 打开游标, 设置查询使用的SQL
cur.execute(getdatasql)
# 执行sql
tabledata = cur.fetchall()
# 将结果集转换到tabledata变量中
fname.write(str(datetime.datetime.now()))
starttime = datetime.datetime.now()
for tableinfo in tabledata :
    print(tableinfo[0] + " " + tableinfo[1])
    getsql =  "select count(upper(" + str(tableinfo[1]) + ")) as  " + str(tableinfo[0]) +" , upper(" + str(tableinfo[1]) +") from " + str(tableinfo[0]) + " group by upper(" +  str(tableinfo[1]) +") having count(upper(" + str(tableinfo[1]) +")) >1 "
    cur.execute(getsql)
    duplication = cur.fetchall()
    tablecheck = 0
    for duplicationitem in duplication :
        if tablecheck == 0 :
            fnamesql.write(tableinfo[0] + '\n')
            tablecheck = 1
        fnamesql.write(str(tableinfo[0]) + " " + str(duplicationitem[0]) + " " + str(duplicationitem[1]) + '\n')
# sql取数相关以及写入文件
endtime = datetime.datetime.now()
seconds = (endtime - starttime).total_seconds()
print("执行时间为: " + str(seconds))
# 计算一下耗时
fname.close()
fnamesql.close()
cur.close()
# 关闭游标 避免泄漏
建表SQL为:
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE zhaobsh001';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/
create table zhaobsh001 as select col.TABLE_NAME,col.column_name from user_constraints con,user_cons_columns col where con.constraint_name=col.constraint_name and con.constraint_type='P' and col.TABLE_NAME in (select TABLE_NAME from user_tables where num_rows > 1 );
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE zhaobsh002';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/
create table zhaobsh002 as select table_name  from (select count(col.TABLE_NAME),col.TABLE_NAME from user_constraints con,user_cons_columns col where con.constraint_name=col.constraint_name and con.constraint_type='P' and col.TABLE_NAME in (select TABLE_NAME from user_tables where num_rows > 1 ) group by col.TABLE_NAME  having(count(col.TABLE_NAME)) > 1 ) ;
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE zhaobsh003';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/
create table zhaobsh003  as select  table_name,column_name from zhaobsh001 where  TABLE_NAME not in (select table_name from zhaobsh002) ;
## 这是一个sql语法的方法
select 'select count(upper('||column_name||')) as  '|| table_name ||' , upper('||column_name||') from '||table_name||' group by upper('||column_name||') having count(upper('||column_name||')) >1 ; ' from zhaobsh003
配置文件的格式为
[Info]
jdbcString=oracle.jdbc.driver.OracleDriver
driverPath=./driver/ojdbc8-19.3.0.0.jar
urlString=jdbc:oracle:thin:@//10.110.xx.xxx:1521/Oracle_sid
userName=yourdatabasename
passWord=somePassword
												
											Python处理Oracle数据库的学习过程的更多相关文章
- python——连接Oracle数据库
		
前言 Python自带的模块中有很多操纵文件的.我们可以把文件的数据读出来,经过处理还可以将数据写入文件中.但是对于数据的管理和分析来说,数据库还是专业一些.如果Python能和数据库结合在一起,那么 ...
 - python对oracle数据库的操作
		
1 Oracle数据库 1.1 Oracle环境配置&客户端连接 1.1.1 下载安装Oracle绿色版客户端instantclient: 到o ...
 - python操作oracle数据库-查询
		
python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...
 - Python 连接 Oracle数据库
		
1.环境设置 [root@oracle ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@oracle ~]# python - ...
 - Python 连接Oracle数据库
		
连接:python操作oracle数据库 python——连接Oracle数据库 python模块:cx_Oracle, DBUtil 大概步骤: 1. 下载模块 cx_Oracle (注意版本) ...
 - python操作oracle数据库
		
本文主要介绍python对oracle数据库的操作学习 包含:oracle数据库在Windows操作系统下的安装和配置.python需要安装的第三方拓展包以及基本操作的样例学习. 1 ...
 - python链接oracle数据库以及数据库的增删改查实例
		
初次使用python链接oracle,所以想记录下我遇到的问题,便于向我这样初次尝试的朋友能够快速的配置好环境进入开发环节. 1.首先,python链接oracle数据库需要配置好环境. 我的相关环境 ...
 - Python操作Oracle数据库:cx_Oracle
		
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
 - 【python】python连接Oracle数据库
		
python连接Oracle数据库 查看Oracle版本 select * from v$version 下载对应版本的InstantClient 下载网址 InstantClient 1.解压Ins ...
 - python 连接oracle 数据库
		
我们在测试中可能需要对oracle 数据库进行操纵,比如这样一个场景,在往oracle 里面插数据的同时,另一个工具从里面读,如何能保证读出来的数据是有顺序的,即:先插入进去的先读出来,根据这个场景们 ...
 
随机推荐
- 神经网络基础篇:详解逻辑回归 & m个样本梯度下降
			
逻辑回归中的梯度下降 本篇讲解怎样通过计算偏导数来实现逻辑回归的梯度下降算法.它的关键点是几个重要公式,其作用是用来实现逻辑回归中梯度下降算法.但是在本博客中,将使用计算图对梯度下降算法进行计算.必须 ...
 - 干了三年的Java,你竟然还不会MySQL性能优化
			
摘要:MySQL性能优化就算通过合理安排资源,调整系统参数使MySQL运行更快,更节省资源.MySQL性能优化包括查询速度优化,更新速度优化,MySQL服务器优化等等. 前言 MySQL性能优化就算通 ...
 - 开发的必杀技:Git 的分支管理
			
摘要:作为一名码农,Git的使用就像家常便饭,时时刻刻都要用到,那么Git分支管理也是必须要掌握的. Git 分支管理 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离 ...
 - 如何在跨平台的环境中创建可以跨平台的后台服务,它就是 Worker Service。
			
一.简介 最近,有一个项目要使用 Windows 服务,来做为一个软件项目的载体.我想了想,都已经到了跨平台的时代了,会不会有替换 Windows 服务的技术出现呢?于是,在网络上疯狂的搜索了一番,真 ...
 - java中类的普通初始化块一定在静态初始化块后运行吗
			
大部分教程都会告诉我们静态初始化块和静态字段总是在初始化块和普通类字段前运行,事实上也确实如此,直到我看到下面这样的代码: public class Test { static Test test = ...
 - WCF 动态调用 动态代理
			
关键词:WCF动态调用.动态调用WCF.WCF使用动态代理精简代码架构.使用反射执行WCF接口 代码地址: https://gitee.com/s0611163/DynamicWCF https:// ...
 - 深入学习和理解 Redux
			
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/jhgQXKp4srsl9_VYMTZXjQ作者:曾超 Redux官网上是这样描述Redux, ...
 - postman+springboot一次上传多个文件
			
开发中到前端一次上传多个文件的需求如何实现,下面使用postman模拟前端的请求,后端使用srpingboot来实现 1.postman设置 2.Java代码 @RestController @Req ...
 - ttf转eot
			
Webfont Generator https://www.fontsquirrel.com/tools/webfont-generator 使用@font-face显示web自定义字体,字体获取工具 ...
 - idea相关配置及插件安装
			
对idea相关的配置及好用的插件进行总结下. 一.idea 破解码及配置:https://www.jb51.net/softs/672190.html 二.idea插件: 1.findBugs-ide ...