python和Oracle交互
第一次用python和Oracle,如果有不对的地方,欢迎大家批评改正。
一、准备工作
-
安装好python
-
安装好Oracle
-
安装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+'')
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: 连接超时