python連接centos上的oracle數據庫 附完整代碼

下載cx_Oracle模塊

yum -y install python3-pip #Centos 7
dnf install python3-pip #CentOS 8
pip2 install cx_Oracle

安裝PIP
安裝插件

測試連接

連接對象

su - oracle
python3
#!/usr/bin/python
#coding=utf-8
import cx_Oracle
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
conn1 = cx_Oracle.connect('user','pass','127.0.0.1:1521/instance')
conn2 = cx_Oracle.connect('user/pass@localhost:1521/instance')
conn3 = cx_Oracle.connect('user','pass','localhost:1521/instance')
cursor= conn1.cursor()
hrm_params = {'login_id':'01040004', 'last_name':'馬學生'}
query1 = cursor.execute('SELECT * FROM HrmResource WHERE loginid=:login_id and lastname=:last_name', hrm_params)
query2 = cursor.execute('SELECT * FROM HrmResource WHERE loginid=:login_id and lastname=:last_name', login_id='01040004', last_name='馬學生')
print(cursor.bindnames())
print(query1.fetchone())
datetime=cursor.execute('select sysdate from dual')
datetime.fetchone()
cursor.close()
conn.close()
conn1.close()

cursor對象詳解

  • cx_Oracle.Cursor.execute(statement,[parameters], **keyword_parameters) #接收單個參數SQL,直接操作數據庫,也可以通過綁定變量執行動態SQL,parames或keyworparameters可以是字典、序列或一組關鍵字參數。
  • cx_Oracle.Cursor.executemany(statement,parameters) #特別有用的批量插入,避免一次只能插入一條;
  • Fetch(optional)#僅用於查詢,因爲DDL和DCL語句沒有返回結果。如果cursor沒有執行查詢,會拋出InterfaceError異常。
  • cx_Oracle.Cursor.fetchall()#獲取所有結果集,返回元祖列表,如果沒有有效行,返回空列表。
  • cx_Oracle.Cursor.fetchmany([rows_no])#從數據庫中取下一個rows_no數據
  • cx_Oracle.Cursor.fetchone()#從數據庫中取單個元祖,如果沒有有效數據返回none

完整代碼

import cx_Oracle
import os
from sys import modules

# 連接Oracle數據庫
class oracleOperation():
	def openOracleConn(self):
		os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
		highway = cx_Oracle.connect('user', 'pass', '127.0.0.1:1521/instance')
		# cx_Oracle.connect("%s/%s@%s/%s" % (userName,password,host,instance))
		return highway

	def select(self, connection):
		cursor = connection.cursor()
		# 數據庫操作
		# 1.查詢 不用提供參數
		sql = 'SELECT id,loginid,password,lastname,pinyinlastname FROM HrmResource where id < 790'
		result = cursor.execute(sql)
		print('type of result', type(result))  # 獲取使用cursor對象的execute的方法返回的對象的類型
		print('result:', result)  # 獲取使用cursor對象的execute的方法返回的對象
		print("Number of rows returned: %d" % cursor.rowcount)
		rows = cursor.fetchall()  # 得到所有數據集
		print("rows:", rows)  # fetchall()方法得到的到底是設麼類型的對象
		for i in rows:
			print('ID:', i[0])
			print('loginid:', i[1])
			print('password:', i[2])
		cursor.close()

	# 2 條件查詢 需提供參數
	def factorSelect(self, connection, param):
		cursor = connection.cursor()
		# 帶參數的查詢  ,例子如下:
		# query1 = cursor.execute('SELECT * FROM employees  WHERE  department_id =:dept_id AND salary >:sal', named_params)
		sql = 'SELECT id,loginid,password,lastname,pinyinlastname FROM HrmResource where  id<:p_id'
		query1 = cursor.execute(sql, param)  # 特別的注意,具體 的條件查詢的格式
		row = cursor.fetchall()
		print(row)
		cursor.close()
		connection.close()
	pass

	# 3 插入1 不用提供參數
	def insert(self, connection):
		cursor = connection.cursor()
		sql = "insert into Python_Oracle (id,kinds,numbers) values (:id,:kinds,:numbers)"
		cursor.prepare(sql)
		# 2,'西瓜','100kg'
		xx = [{'id': 6}, {'kinds': '荔枝'}, {'numbers': '100kg'}]
		# result=cursor.execute(None,{'id':6,'kinds':'荔枝','numbers':'100kg'})
		# result=cursor.execute(None,xx)
		result = cursor.execute(None, xx)
		print("Insert result:", result)
		connection.commit()
		cursor.close()
		connection.close()
	pass

	# 4插入2 需提供參數
	def insert2(self, connection, insertParam=[]):
		cursor = connection.cursor()
		# M=[(11,'sa','sa'),]
		sql = "insert into Python_Oracle (id,kinds,numbers) values (:id,:kinds,:numbers)"
		if (len(insertParam) == 0):
			print("插入的數據行的參數不能爲空!")
		else:
			cursor.prepare(sql)
			result = cursor.executemany(None, insertParam)
			print("Insert result:", result)
			# count=cursor.execute("SELECT COUNT(*) FROM python_modules")
			# print("count of python_modules:",count)
		connection.commit()
		cursor.close()
		connection.close()
	pass

	# 插入3
	def insert3(self, connection):
		cursor = connection.cursor()
		create_table = """
		CREATE TABLE python_modules1 (
		module_name VARCHAR2(50) NOT NULL,
		file_path VARCHAR2(300) NOT NULL
		)
		"""
		# cursor.execute(create_table)

		M = []
		for m_name, m_info in modules.items():
			try:
				if (m_info.__file__ == None):
					m_info.__file__ = 'None'
				M.append((m_name, m_info.__file__))
			except AttributeError:
				pass
		print("M", M)
		for item in M:
			print(item)

		sql = "INSERT INTO python_modules1(module_name, file_path) VALUES (:1, :2)"
		cursor.prepare(sql)
		cursor.executemany(None, M)
		connection.commit()
		count = cursor.execute("SELECT COUNT(*) FROM python_modules1")
		print("count of python_modules1:", count)
		connection.commit()
		cursor.close()
		connection.close()
	pass

	def Delete(self, conn):
		cursor = conn.cursor()
		sql = "delete "
	pass

if __name__ == '__main__':
	db = oracleOperation()
	connection = db.openOracleConn()

	# 能運行的無條件查詢語句
	# db.select(connection)

	# 能夠運行的條件查詢語句
	hrm_params = {'p_id': 790}
	# db.factorSelect(connection,hrm_params)

	db.insert3(connection)

	# 自己的能夠運行的insert語句
	# insertParam=[(5,'大象','1T'),(6,'螞蟻','0.001g')]
	# db.insert2(connection,insertParam)

相關問題解決

oracle亂碼問題解決方案

# -*- coding: utf-8 -*-
import cx_Oracle
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
conn1 = cx_Oracle.connect('用戶','密碼','地址:端口/instance')
cursor= conn1.cursor()
hrm_params = {'login_id':'01040004', 'last_name':'馬學生'}
query1 = cursor.execute('SELECT * FROM HrmResource WHERE loginid=:login_id and lastname=:last_name', hrm_params)
print(cursor.bindnames())
print(query1.fetchone())
#print(query1.fetchone().decode('utf-8'))
#cursor.execute('insert into test_ccc values(1,sysdate,\'北\')') 
#conn1.commit() 
conn1.close()

解決DatabaseError: DPI-1047

錯誤截圖
Oracle Instant Client Downloads 需要安裝oracle的即時客戶端
oracle instant
19.5
解壓 instantclient-basic-windows.x64-19.5.0.0.0dbru.zip到目錄中,添加這個目錄到環境變量path中。【高級系統設置】
環境變量

參考鏈接

Error: DPI-1047: Cannot locate a 64-bit Oracle Client library:"
python操作oracle完整教程

發佈了37 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章