python和Oracle交互

python和Oracle交互

第一次用python和Oracle,如果有不对的地方,欢迎大家批评改正。

一、准备工作

  1. 安装好python

  2. 安装好Oracle

  3. 安装cx-oracle

    在cmd中输入 pip insatll cx_Oracle 即可安装好cx-oracle

   pip insatll cx_Oracle

二、交互

1. 框架

import cx_Oracle
import datetime
from dateutil.relativedelta import relativedelta
# 必须写下面两行,不然会乱码
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
# 对象名 = cx_Oracle.connect('用户名', '密码', '监听地址/数据库名')
conn = cx_Oracle.connect('scott', 'tiger', '10.198.234.28:1521/orcl')
# 游标对象名 = 对象名.cursor()
cursor = conn.cursor()


#这里写功能代码


# 当SQL语句为查询语句或者插入数据语句时,通过数据库对象引用commit()方法提交更新数据。如:
conn.commit()
# 当所有操作执行完之后,关闭游标的使用,即关闭后台指向,通过调用其close()方法。
cursor.close()
# 所有操作执行完之后,关闭数据库的连接,通过数据库对象名调用其close()方法进行关闭。
conn.close()
  • 因为我的Oracle数据库是安装在我的电脑上的,所以这里的10.198.234.28是我电脑的主机号,电脑主机号可以通过 设置——网络——WLAN——向下滑找到IPV4地址,这个IPV4地址就是主机号

  • 1521是端口号,一般都是1521

  • scott是Oracle自带的账户, tiger是我安装的时候给Scott设置的密码

2.执行语句

#sql语句和正常的sql语句相同
sql = """
    CREATE TABLE student (
    sid number primary key,
    sname varchar2(30),
    sage number
    )"""
sql2 = """insert into student values(:sid,:sname,:sage)"""
param = [(100001, '张三', 19)]
param1 = [(100002, '李四', 20), (100003, '王五', 21)]
# 通过游标对象名调用execute()方法执行单条SQL语句
cursor.execute(sql)
cursor.execute(sql3)
# 通过游标对象名调用executemany(sql, param)方法执行多条SQL语句。插入多条数据值时常用,每行的数据值应封装在一个元组内,再使用列表进行封装。
cursor.executemany(sql2, param)
cursor.executemany(sql2, param1)
  • execute()方法执行单条SQL语句
  • executemany(sql, param)方法执行多条SQL语句

3.得到结果

fetchall():一次获取所有记录

sql3 = """select * from student"""
a = cursor.execute(sql3).fetchall()
print(a)
print(type(a))
print(a[0])
print(a[0][0])
  • 结果如下显示
    在这里插入图片描述

三、整体代码

from unittest import result
import cx_Oracle
import datetime
from dateutil.relativedelta import relativedelta
# 必须写下面两行,不然会乱码
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
# 对象名 = cx_Oracle.connect('用户名', '密码', '监听地址/数据库名')
conn = cx_Oracle.connect('scott', 'tiger', '10.198.234.28:1521/orcl')
# 游标对象名 = 对象名.cursor()
cursor = conn.cursor()


# 这里写功能代码
# sql语句和正常的sql语句相同
sql = """
    CREATE TABLE student (
    sid number primary key,
    sname varchar2(30),
    sage number
    )"""
sql2 = """insert into student values(:sid,:sname,:sage)"""
param = [(100001, '张三', 19)]
param1 = [(100002, '李四', 20), (100003, '王五', 21)]

# 通过游标对象名调用execute()方法执行单条SQL语句
cursor.execute(sql)
# 通过游标对象名调用executemany(sql, param)方法执行多条SQL语句。插入多条数据值时常用,每行的数据值应封装在一个元组内,再使用列表进行封装。
cursor.executemany(sql2, param)
cursor.executemany(sql2, param1)

# 当SQL语句为查询语句或者插入数据语句时,通过数据库对象引用commit()方法提交更新数据。如:
conn.commit()

sql3 = """select * from student"""
a = cursor.execute(sql3).fetchall()
print(a)
print(type(a))
print(a[0])
print(a[0][0])

# 当所有操作执行完之后,关闭游标的使用,即关闭后台指向,通过调用其close()方法。
cursor.close()
# 所有操作执行完之后,关闭数据库的连接,通过数据库对象名调用其close()方法进行关闭。
conn.close()

四、一些高级操作

主要是我做小项目的时候遇到的小问题。

1.用txt文件传入 对象名 = cx_Oracle.connect(‘用户名’, ‘密码’, ‘监听地址/数据库名’)

#打开文件,txt文件放在与此python同一个文件夹下
f = open('shujuku.txt', encoding='gbk')
txt = []
for line in f:
	txt.append(line.strip())
a = txt[0]
b = txt[1]
c = txt[2]
conn = cx_Oracle.connect('' + a + '', ''+b+'', ''+c+'')

txt文件

2.如果sql需要用到上面的变量

cursor.execute( "select * from branch where b_name like '%{0}%'".format(search_info))

3.判断表是否存在,如果存在则不再建表,如果不存在则建表

# 判断分支机构信息表是否存在
sql20 = """select count(1) from all_tables where TABLE_NAME = 'BRANCH' """
count2 = cursor.execute(sql20).fetchall()[0][0]
print(count2)
# count=0表示表不存在,需要建表。count!=0表示表已经存在,不需要再次建表
if count2 == 0:
	cursor.execute(sql2)

4.连接错误

如果以前都可以连接数据库,突然有一天连接不上了,并且如下显示的话。可能是主机IP变了,在用上面提到的方法去查一下IPv4地址是否改变了。

cx_Oracle.DatabaseError: ORA-12170: TNS: 连接超时
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值