IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Python连接Oracle实现增删改查 -> 正文阅读

[大数据]Python连接Oracle实现增删改查

目录:

Python连接Oracle实验

下载对应模块(cx_Oracle)

1.到python根目录,根目录找到scripts文件夹

2.进入scripts文件夹,在资源管理器中,光标移动到路径并双击,敲cmd然后回车

3.安装,在cmd中输入以下命令并回车:

pip install cx_Oracle

如果提示版本不是最新的不用管(变相的告诉我们已经安装成功)

查看Oracle服务器端口

其实默认的都是127.0.0.1/1521,可以省略这一步骤,如果不放心的话,可以试着操作一下:

1.电脑上按win+r 写入cmd运行

2.在cmd中运行如下命令:

lsnrctl status

3.查看cmd中显示的消息,在中间的部分你会发现会有以下字段:

监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))

可以看到我们的端口号就是:127.0.0.1/1521

开始实践

任务要求:

  1. 建立python函数,对teacher表中数据进行修改,要求SQL语句中,通过参数传递值,构建修改值和查询条件,进行数据修改。

  2. 建立python函数,删除course表中的数据,要求SQL语句中,通过参数传递值,构建查询条件,进行数据删除。

  3. 建立python函数,查询对teacher和course表进行数据更新操作前后的结果。

使用plsql图形界面工具,其中创建teacher表等一系列数据的sql命令如下:

--创建数据表
create table teacherCard
(
tcid int primary key,
tcdesc varchar2(20)
);

create table teacher
(
tid int primary key,
tname varchar2(20),
tcid int references teacherCard(tcid)
);

create table course
(
cid int primary key,
cname varchar2(20),
tid int references teacher(tid)
);
--输入数据
insert into teacherCard values(1,'tzdesc');
insert into teacherCard values(2,'twdesc');
insert into teacherCard values(3,'tldesc');
insert into teacher values(1,'tz',1);
insert into teacher values(2,'tw',2);
insert into teacher values(3,'tl',3);
insert into course values(1,'java',1);
insert into course values(2,'html',1);
insert into course values(3,'sql',2);
insert into course values(4,'web',3);
commit;

在开始前首先创建好Oracle类:

class Oracle(object):
    def __init__(self,userName,password,host,instance):
        self._conn = cx_Oracle.connect("%s/%s@%s/%s" % (userName,password,host,instance))
        #self._conn = cx_Oracle.connect('system', 'Cfy123456', '127.0.0.1:1521/orcl')
        self.cursor = self._conn.cursor()
    
    def queryAll(self,sql):
        self.cursor.execute(sql)
        return self.cursor.fetchall()
    
    def queryOne(self,sql):
        self.cursor.execute(sql)
        return self.cursor.fetchone()
    
    def queryBy(self,sql,nameParams={}):
        if len(nameParams) > 0 :
            self.cursor.execute(sql,nameParams)
        else:
            self.cursor.execute(sql)
            
        return self.cursor.fetchall()
    
    def insertBatch(self,sql,nameParams=[]):
        """batch insert much rows one time,use location parameter"""
        self.cursor.prepare(sql)
        self.cursor.executemany(None, nameParams)
        self.commit()
    
    def commit(self):
        self._conn.commit()
    
    def __del__(self):
        if hasattr(self,'cursor'): 
            self.cursor.close()
            
        if hasattr(self,'_conn'): 
            self._conn.close()

对表进行修改

注意:使用部分操作需要commit,否则程序会卡住不动

		#构建修改值newVal 构建查询条件condition
  	def update_teacher(self, newVal, condition):
      	sql = "UPDATE teacher SET TCID = " + newVal + "WHERE " + condition
        self.cursor.execute(sql)
        self.commit()
        print("成功修改teacher表")

对表中数据进行删除

注意:使用部分操作需要commit,否则程序会卡住不动

		#构建查询条件condition
  	def delete_course(self, condition):
      	sql = "DELETE course WHERE " + condition
        self.cursor.execute(sql)
        self.commit()
        print("成功删除course表中的数据")

修改操作后的查询验证

def queryResult:
		sql1 = "SELECT * FROM teacher"
		sql2 = "SELECT * FROM course"
		oraDb = Oracle('system','Sl123456','127.0.0.1:1521','orcl')
		fields1 = oraDb.queryAll(sql1)
		fields2 = oraDb.queryAll(sql2)
		print(fields1)
		print(fields2)

完整的python代码

import cx_Oracle

class Oracle(object):
    def __init__(self,userName,password,host,instance):
        self._conn = cx_Oracle.connect("%s/%s@%s/%s" % (userName,password,host,instance))
        #self._conn = cx_Oracle.connect('system', 'Cfy123456', '127.0.0.1:1521/orcl')
        self.cursor = self._conn.cursor()
    
    def queryAll(self,sql):
        self.cursor.execute(sql)
        return self.cursor.fetchall()
    
    def queryOne(self,sql):
        self.cursor.execute(sql)
        return self.cursor.fetchone()
    
    def queryBy(self,sql,nameParams={}):
        if len(nameParams) > 0 :
            self.cursor.execute(sql,nameParams)
        else:
            self.cursor.execute(sql)
            
        return self.cursor.fetchall()
    
    def insertBatch(self,sql,nameParams=[]):
        """batch insert much rows one time,use location parameter"""
        self.cursor.prepare(sql)
        self.cursor.executemany(None, nameParams)
        self.commit()
        
    #构建修改值newVal 构建查询条件condition
    def update_teacher(self, newVal, condition):
        sql = "UPDATE teacher SET TNAME = " + newVal + " WHERE " + condition
        self.cursor.execute(sql)
        print("成功修改teacher表")
        self.commit()

    #构建查询条件condition
    def delete_course(self, condition):
        sql = "DELETE course WHERE " + condition
        self.cursor.execute(sql)
        self.commit()
        print("成功删除course表中的数据")
        
    def commit(self):
        self._conn.commit()
    
    def __del__(self):
        if hasattr(self,'cursor'): 
            self.cursor.close()
            
        if hasattr(self,'_conn'): 
            self._conn.close()
def queryResult():
        sql1 = "SELECT * FROM teacher"
        sql2 = "SELECT * FROM course"
        oraDb = Oracle('system','Cfy123456','127.0.0.1:1521','orcl')
        fields1 = oraDb.queryAll(sql1)
        fields2 = oraDb.queryAll(sql2)
        print(fields1)
        print(fields2)
def test1():
    oraDb = Oracle('system','Cfy123456','127.0.0.1:1521','orcl')
    newVal = "'cfy'"
    condition = "TID = 1"
    oraDb.update_teacher(newVal, condition)
def test2():
    oraDb = Oracle('system','Cfy123456','127.0.0.1:1521','orcl')
    condition = "CID = 1"
    oraDb.delete_course(condition)
print("修改之前的表:")
queryResult()
test1()
test2()
print("修改之后的表:")
queryResult()

运行结果如下:

修改之前的表:
[(1, ‘tz’, 1), (2, ‘tw’, 2), (3, ‘tl’, 3)]
[(1, ‘java’, 1), (2, ‘html’, 1), (3, ‘sql’, 2), (4, ‘web’, 3)]
成功修改teacher表
成功删除course表中的数据
修改之后的表:
[(1, ‘cfy’, 1), (2, ‘tw’, 2), (3, ‘tl’, 3)]
[(2, ‘html’, 1), (3, ‘sql’, 2), (4, ‘web’, 3)]

实验过程中遇到的问题

在实验过程中遇到了一些比较棘手的问题,甚至有难以觉查的bug改的我甚至有点想杀人了

  1. 操作的字段如果是字符串,必须要加单引号,不然会报错
  2. sql语句中的增删改查,在用python操作的时候,有些需要commit,不然会一直卡住深受其害
  3. 运行在Python的IDLE中,也会被卡住,不知道原因是什么,但是在jupyter notebook中是可以运行的

拓展

这是第二种操作模板,感觉会比较舒服些,已经实现了增删改查功能,可以直接用

#  coding=utf-8
import cx_Oracle
import os
import json
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

class TestOracle(object):
    def  __init__(self,user,pwd,ip,port,sid):
        self.connect=cx_Oracle.connect(user+"/"+pwd+"@"+ip+":"+port+"/"+sid)
        self.cursor=self.connect.cursor()

    """处理数据二维数组,转换为json数据返回"""
    def select(self,sql):
        list=[]
        self.cursor.execute(sql)
        result=self.cursor.fetchall()
        col_name=self.cursor.description
        for row in result:
            dict={}
            for col in range(len(col_name)):
                key=col_name[col][0]
                value=row[col]
                dict[key]=value
            list.append(dict)
        js=json.dumps(list,ensure_ascii=False,indent=2,separators=(',',':'))
        return js
    def disconnect(self):
        self.cursor.close()
        self.connect.close()
    def insert(self,sql,list_param):
        try:
            self.cursor.executemany(sql,list_param)
            self.connect.commit()
            print("插入ok")
        except Exception as e:
            print(e)
        finally:
            self.disconnect()
    def update(self,sql):
        try:
            self.cursor.execute(sql)
            self.connect.commit()

        except Exception as e:
            print(e)
        finally:
            self.disconnect()
    def delete(self,sql):
        try:
            self.cursor.execute(sql)
            self.connect.commit()
            print("delete ok")
        except Exception as e:
            print(e)
        finally:
            self.disconnect()
def update_teacher(newVal, condition):
    sql = "UPDATE teacher SET TNAME = " + newVal + " WHERE " + condition
    test_oracle = TestOracle('system','Cfy123456','127.0.0.1','1521','orcl')
    test_oracle.update(sql)
    print("成功修改teacher表")

def delete_course(condition):
    sql = "DELETE course WHERE " + condition
    test_oracle = TestOracle('system','Cfy123456','127.0.0.1','1521','orcl')
    test_oracle.delete(sql)
    print("成功删除course表中的数据")

def queryResult():
    sql1 = "SELECT * FROM teacher"
    sql2 = "SELECT * FROM course"
    test_oracle = TestOracle('system','Cfy123456','127.0.0.1','1521','orcl')
    fields1 = test_oracle.select(sql1)
    fields2 = test_oracle.select(sql2)
    print(fields1)
    print(fields2)

if __name__ =="__main__":
    print("修改之前的表:")
    queryResult()
    update_teacher("'cfy'","TID = 1")
    delete_course("CID = 1")
    print("修改之后的表:")
    queryResult()

运行结果如下:

修改之前的表:
[
{
“TID”:1,
“TNAME”:“tz”,
“TCID”:1
},
{
“TID”:2,
“TNAME”:“tw”,
“TCID”:2
},
{
“TID”:3,
“TNAME”:“tl”,
“TCID”:3
}
]
[
{
“CID”:2,
“CNAME”:“html”,
“TID”:1
},
{
“CID”:3,
“CNAME”:“sql”,
“TID”:2
},
{
“CID”:4,
“CNAME”:“web”,
“TID”:3
}
]
成功修改teacher表
delete ok
成功删除course表中的数据
修改之后的表:
[
{
“TID”:1,
“TNAME”:“cfy”,
“TCID”:1
},
{
“TID”:2,
“TNAME”:“tw”,
“TCID”:2
},
{
“TID”:3,
“TNAME”:“tl”,
“TCID”:3
}
]
[
{
“CID”:2,
“CNAME”:“html”,
“TID”:1
},
{
“CID”:3,
“CNAME”:“sql”,
“TID”:2
},
{
“CID”:4,
“CNAME”:“web”,
“TID”:3
}
]
e ok
成功删除course表中的数据
修改之后的表:
[
{
“TID”:1,
“TNAME”:“cfy”,
“TCID”:1
},
{
“TID”:2,
“TNAME”:“tw”,
“TCID”:2
},
{
“TID”:3,
“TNAME”:“tl”,
“TCID”:3
}
]
[
{
“CID”:2,
“CNAME”:“html”,
“TID”:1
},
{
“CID”:3,
“CNAME”:“sql”,
“TID”:2
},
{
“CID”:4,
“CNAME”:“web”,
“TID”:3
}
]

参考1
参考2

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:18:09  更:2022-04-04 12:18:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:34:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码