下載cx_Oracle模塊
yum -y install python3-pip #Centos 7
dnf install python3-pip #CentOS 8
pip2 install cx_Oracle
測試連接
連接對象
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的即時客戶端
解壓 instantclient-basic-windows.x64-19.5.0.0.0dbru.zip
到目錄中,添加這個目錄到環境變量path中。【高級系統設置】
參考鏈接
Error: DPI-1047: Cannot locate a 64-bit Oracle Client library:"
python操作oracle完整教程