最近在学习使用Python,操作Oracle数据库采用的是cx_Oracle模块。
对于基本字段,都可以正常操作。但是对于Blob字段,我试试好几次,都没成功。下面贴出测试代码,与大家讨论讨论。
这是操作的持久对象。本人对Python刚刚接触,不知道Python有没有好的ORM框架。
class Report(object): selectSql="select RPTID,CLGID,RPTNAME,RPTTYPE,RPTDESC,QUALITYSIGNALS,DISPLAYSETTING,EXCELRANGE,HTMLTEMPLATE from rpt_report order by rptid" createTableSql='''/*==============================================================*//* Table: RPT_REPORT *//*==============================================================*/create table RPT_REPORT ( RPTID NUMBER not null, CLGID NUMBER, RPTNAME VARCHAR2(50) not null, RPTTYPE NUMBER not null, RPTDESC VARCHAR2(100), QUALITYSIGNALS VARCHAR2(50), DISPLAYSETTING VARCHAR2(50), EXCELRANGE VARCHAR2(30), HTMLTEMPLATE BLOB, constraint PK_RPT_REPORT primary key (RPTID) using index); ''' deleteSql="delete from rpt_report" def __init__(self,RPTID,CLGID,RPTNAME,RPTTYPE,RPTDESC,QUALITYSIGNALS,DISPLAYSETTING,EXCELRANGE,HTMLTEMPLATE): self.RPTID=RPTID self.CLGID=CLGID self.RPTNAME=RPTNAME self.RPTTYPE=RPTTYPE self.RPTDESC=RPTDESC and RPTDESC or "" self.QUALITYSIGNALS=QUALITYSIGNALS and QUALITYSIGNALS or "" self.DISPLAYSETTING=DISPLAYSETTING and DISPLAYSETTING or "" self.EXCELRANGE=EXCELRANGE and EXCELRANGE or "" self.HTMLTEMPLATE=HTMLTEMPLATE and HTMLTEMPLATE or "" def gerInsertSQL(self): sql="insert into rpt_report(RPTID,CLGID,RPTNAME,RPTTYPE,RPTDESC,QUALITYSIGNALS,DISPLAYSETTING,EXCELRANGE,HTMLTEMPLATE) values (%d,%d,'%s',%d,'%s','%s','%s','%s',:HTMLTEMPLATE)" return sql
其中,report表的“HTMLTEMPLATE”字段是blob类型。
下面是测试程序。程序的目的主要是完成数据迁移。
import cx_Oracleimport sys#1.5 databaseconnection = cx_Oracle.Connection("pw_report/report@tpri")cursor = connection.cursor()#2.0 databaseconn=cx_Oracle.Connection("pw_report2/report@tpri")cur=conn.cursor()cursor.execute(Report.selectSql)cursor.rowfactory = Reportindex=0isRollback=Falsefor row in cursor: sql=row.gerInsertSQL() try: HTMLTEMPLATE=row.HTMLTEMPLATE and row.HTMLTEMPLATE or "" sql=sql % (row.RPTID,row.CLGID,row.RPTNAME,row.RPTTYPE,row.RPTDESC,row.QUALITYSIGNALS,row.DISPLAYSETTING,row.EXCELRANGE) print sql cur.setinputsizes(HTMLTEMPLATE=cx_Oracle.BLOB) cur.execute(sql,{"HTMLTEMPLATE":HTMLTEMPLATE}) index+=1 except cx_Oracle.DatabaseError, exc: print "break le 11" isRollback=True break except: print "break le 22" isRollback=True breakprint "\n insert data: %d" % indexif isRollback: conn.rollback()else: conn.commit()conn.close()connection.close()
以上程序,若BLOB字段内容为空,就可以执行通过,若不为空,则无法插入。
在此与大家分享沟通下。