cx_Oracle 是一个Python的扩展模块,通过使用所有数据库访问的模块通用的数据库API来是实现Oracle数据库的查询和更新。
cx_Oracle的开发历时十多年,涵盖了大多数需要在Python中访问Oracle的客户的需求。2008年12月,一个新的主要版本解决了早期版本的众多限制,并增添了对Python3.0和Oracle新推进的一些特性的支持。
下面写一个是简单的转账例子,附上代码
配置工作(Oracle.settings.py)
1 # -*- coding: utf-8 -*- 2 3 import cx_Oracle 4 5 6 ##操作Oracle数据库 7 class Oracle: 8 #连接Oracle数据库 9 def oracle_Conn(self,oracle_user,oracle_password,oracle_ip,oracle_port,oracle_service_name): 10 print('正在连接Oracle数据库.......') 11 global conn 12 # 用户,密码,oracle数据库服务名称(或数据库系统标识符SID) 13 conn = cx_Oracle.connect(oracle_user, oracle_password, '%s:%s/%s'%(oracle_ip,oracle_port,oracle_service_name),encoding = 'UTF-8') 14 15 16 #传进sql查询语句 17 def oracle_DQL(self,DQL_sql,params=[],rownums=0,fetchmany=False,fetchall=False): 18 #建立游标 19 # 此代码确保一旦完成该块,就将游标关闭并且数据库已回收资源。此外,任何cursor在块外使用变量的尝试都将失败 20 with conn.cursor(scrollable=True) as cur: 21 cur.execute(DQL_sql,params) 22 if fetchall == True: 23 query_res = cur.fetchall() 24 elif fetchmany == True: 25 query_res = cur.fetchmany(rownums) 26 else: 27 if rownums != 0: 28 cur.scroll(rownums) 29 query_res = cur.fetchone() 30 return query_res 31 32 ##创建表,DDL语句,不用提交 33 def oracle_DDL(self,DDL_sql,bind_params=[]): 34 with conn.cursor() as cur: 35 res = cur.execute(DDL_sql,bind_params) 36 return 'suc' 37 38 #数据操纵语句,insert,update,delete等 39 def oracle_DML(self,DML_SQL,bind_params=[]): 40 with conn.cursor() as cur: 41 res = cur.execute(DML_SQL,bind_params) 42 conn.commit() 43 return 'suc' 44 45 def oracle_Conn_Close(self): 46 conn.close() 47 print('Oracle数据库连接已经关闭.......') 48 49 ''' 50 obj = Oracle() 51 obj.oracle_Conn('back','123','127.0.0.1','1521','orcl') 52 res = obj.oracle_DQL('select * from students') 53 print(res) 54 obj.oracle_Conn_Close() 55 ''' 56 57 ''' 58 注意:对于回收站的对象,只支持查询操作,其他DDL,DML操作均不支持。 59 DQL:数据查询语句,查询操作,默认隐式提交 60 DML:数据操纵语句 insert,update,delete (Manipulation) conn.commit() 61 DCL:数据控制语言 grant rollback 62 用户授权或者访问数据库的某种特权,并控制数据库事务发生的时间和效果 63 DDL:数据定义语言:create 创建数据库各种对象(隐式提交,不能rollback) 64 '''
创建表(transaction_record_table,bankcard_table,alipay_table)
1 from examples.oracle_settings import Oracle 2 3 ##连接oracle数据库 4 obj = Oracle() 5 obj.oracle_Conn('back','123','127.0.0.1','1521','orcl') 6 7 #-------------------------------------------------------------------------------------------------------------------- 8 ##创建表 9 sql = ''' 10 create table transaction_record_table 11 ( 12 order_number varchar2(50) not null, 13 transcation_amount number not null, 14 transaction_event varchar2(50) not null, 15 trader varchar2(50) not null, 16 Payee varchar2(50) not null, 17 transaction_time timestamp, 18 status varchar2(20), 19 primary key(order_number) 20 ) 21 ''' 22 ##创建transaction_record表 23 obj.oracle_DDL(sql) 24 25 obj.oracle_DDL(sql) 26 #-------------------------------------------------------------------------------------------------------------------- 27 28 sql = ''' 29 create table Bankcard_table 30 ( 31 bankcard_bid number, 32 owner_name varchar2(20) not null, 33 owner_idcard varchar2(20) not null unique, 34 bankcard_amount number not null check(bankcard_amount>0), 35 lock_status varchar(10) default 'False' not null, 36 primary key(Bankcard_bid) 37 ) 38 ''' 39 ##Bankcard 40 obj.oracle_DDL(sql) 41 42 43 sql = ''' 44 create table alipay_table 45 ( 46 alipay_bid number, 47 owner_name varchar2(20) not null, 48 owner_idcard varchar2(20) not null unique, 49 alipay_amount number(5) not null check(alipay_amount>0 and alipay_amount<100000), 50 lock_status varchar(10) default 'False' not null, 51 primary key(alipay_bid) 52 ) 53 ''' 54 ##alipay 55 obj.oracle_DDL(sql) 56 #-------------------------------------------------------------------------------------------------------------------- 57 58 obj.oracle_Conn_Close()
插入数据(bankcard_table,alipay_table) 可逐行插入
1 from examples.oracle_settings import Oracle 2 3 ##连接oracle数据库 4 obj = Oracle() 5 obj.oracle_Conn('back','123','127.0.0.1','1521','orcl') 6 7 8 ##插入数据 9 #BANKCARD_TABLE 10 insert_sql = """ 11 INSERT INTO ALIPAY_TABLE (ALIPAY_BID, OWNER_NAME, OWNER_IDCARD, ALIPAY_AMOUNT,LOCK_STATUS) VALUES (1, '张三', '5456567687787878', 100,'False'); 12 INSERT INTO ALIPAY_TABLE(ALIPAY_BID, OWNER_NAME, OWNER_IDCARD, ALIPAY_AMOUNT,LOCK_STATUS) VALUES (2, '小五', '545467676767676', 300,'False'); 13 INSERT INTO ALIPAY_TABLE(ALIPAY_BID, OWNER_NAME, OWNER_IDCARD, ALIPAY_AMOUNT,LOCK_STATUS) VALUES (3, '小何', '6676768778787878', 40000,'False'); 14 INSERT INTO ALIPAY_TABLE(ALIPAY_BID, OWNER_NAME, OWNER_IDCARD, ALIPAY_AMOUNT,LOCK_STATUS) VALUES (4, '小李', '54545465676767676', 3000,'False'); 15 INSERT INTO ALIPAY_TABLE(ALIPAY_BID, OWNER_NAME, OWNER_IDCARD, ALIPAY_AMOUNT,LOCK_STATUS) VALUES (5, '小黑', '4545465656565656', 10,'False'); 16 INSERT INTO ALIPAY_TABLE(ALIPAY_BID, OWNER_NAME, OWNER_IDCARD, ALIPAY_AMOUNT,LOCK_STATUS) VALUES (6, '二虎', '4566567676878787', 5666,'False'); 17 """ 18 #BANKCARD_TABLE 19 obj.oracle_DML(insert_sql) 20 21 22 ##alipay_table 23 insert_sql = ''' 24 insert into BANKCARD_TABLE (BANKCARD_BID, OWNER_NAME, OWNER_IDCARD, BANKCARD_AMOUNT,LOCK_STATUS) values (1, '张三', '5456567687787878', 3000,'False'); 25 insert into BANKCARD_TABLE (BANKCARD_BID, OWNER_NAME, OWNER_IDCARD, BANKCARD_AMOUNT,LOCK_STATUS) values (2, '小黑', '4545465656565656', 10000,'False'); 26 insert into BANKCARD_TABLE (BANKCARD_BID, OWNER_NAME, OWNER_IDCARD, BANKCARD_AMOUNT,LOCK_STATUS) values (3, '小明', '5454546565767676', 500,'False'); 27 insert into BANKCARD_TABLE (BANKCARD_BID, OWNER_NAME, OWNER_IDCARD, BANKCARD_AMOUNT,LOCK_STATUS) values (4, '小李', '54545465676767676', 3000,'False'); 28 insert into BANKCARD_TABLE (BANKCARD_BID, OWNER_NAME, OWNER_IDCARD, BANKCARD_AMOUNT,LOCK_STATUS) values (5, '小五', '545467676767676', 1000,'False'); 29 ''' 30 obj.oracle_DML(insert_sql) 31 obj.oracle_Conn_Close()
Alipay_table表
Bankcard_table表
Oracle_case
1 from examples.oracle_settings import Oracle 2 import random,string 3 4 5 class Transaction: 6 #银行卡到alipay的请求 7 def bankToAlipay(self,tran_request): 8 ##连接oracle数据库 9 obj = Oracle() 10 obj.oracle_Conn('back','123','127.0.0.1','1521','orcl') 11 12 13 #需要取的数据 >> 银行卡金额(bankcard_amount) , lock_status 14 #绑定变量 15 params = {'idcard':tran_request[0]} 16 lock_sql = 'select bankcard_amount,lock_status from BANKCARD_TABLE where owner_idcard = :idcard' 17 res = obj.oracle_DQL(lock_sql,params) 18 19 #如果没有被交易的话,则可以进行交易,同时需要判断银行卡总金额是否大于所需要交易的金额 20 if res[1] == 'False' and res[0] >= tran_request[-1]: 21 print('----------------------------------------------------------------------------------------') 22 23 ##首先判断此随机生成的订单编号是否存在,如果存在,则重新生成 24 for index in range(5): 25 order_number = str(random.randint(1000, 10000)) + string.printable[:16] 26 params = {'order_number_value':order_number} 27 query_sql = 'select * from transaction_record_table where order_number =:order_number_value' 28 29 query_res = obj.oracle_DQL(query_sql,params) 30 if query_res == None: 31 break 32 33 print('正在处理用户银行卡-alipay的交易[交易编号:%s]........'%order_number) 34 35 lasted_amount = res[0] - tran_request[-1] 36 update_params = {'a':'True','b':lasted_amount,'c':tran_request[0]} 37 print(update_params) 38 39 #此时更新状态为True,原账户需要更改金额 40 update_sql = 'update BANKCARD_TABLE set lock_status = :a ,bankcard_amount = :b where owner_idcard = :c' 41 result = obj.oracle_DML(update_sql,update_params) 42 43 44 ##如果处理成功,则另一个表alipay的金额要更改,而且需要写入到交易记录表记录下来 45 if result == 'suc': 46 #需要获取alipay_table的金额数量 47 target_params = [tran_request[1]] 48 sql = 'select alipay_amount from alipay_table where owner_idcard=:1' 49 r = obj.oracle_DQL(sql,target_params) 50 51 ##如果没有找到此人的话 52 if r == []: 53 print('没有找到此用户.....') 54 exit() 55 target_amount = tran_request[-1] + r[0] 56 57 ##目标账户需要更改金额 58 params = [target_amount,tran_request[1]] 59 alipay_update_sql = 'update alipay_table set alipay_amount = :1 where owner_idcard = :2' 60 result = obj.oracle_DML(alipay_update_sql,params) 61 62 63 ##如果处理成功,则写入交易记录表 64 if result != 'suc': 65 print('交易处理失败....') 66 exit() 67 #获取当前时间 68 sql = 'select systimestamp from dual' 69 current_time = obj.oracle_DQL(sql)[0] 70 71 72 ## 73 params = [order_number,tran_request[-1],'银行卡 to alipay',tran_request[0],tran_request[1],current_time,'suc'] 74 insert_sql = 'insert into transaction_record_table values(:1,:2,:3,:4,:5,:6,:7)' 75 result = obj.oracle_DML(insert_sql,params) 76 77 ##最后需要更改状态为False 78 if result == 'suc': 79 params = ['False',tran_request[0]] 80 sql = 'update BANKCARD_TABLE set lock_status = :1 where owner_idcard = :2' 81 obj.oracle_DML(sql,params) 82 obj.oracle_Conn_Close() 83 print('处理该用户交易[交易编号:%s]成功.....'%order_number) 84 print('----------------------------------------------------------------------------------------') 85 return 'suc' 86 else: 87 print('交易失败') 88 return 'fail' 89 else: 90 print('该用户银行卡交易已在进行,不可再处理,请等待.........') 91 return '正在繁忙...' 92 93 94 95 #source_idcard, target_idcard source target(银行卡 支付宝)amount 96 97 #小明 > 小黑 98 #tran_request = ['5454546565767676','4545465656565656','银行卡','alipay',100] 99 #张三 > 二虎 100 tran_request = ['5456567687787878','4566567676878787','银行卡','alipay',200] 101 result = Transaction().bankToAlipay(tran_request) 102 print(result)
交易请求
tran_request = ['5456567687787878','4566567676878787','银行卡','alipay',200]