浏览 3583 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-30
对于基本字段,都可以正常操作。但是对于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_Oracle import sys #1.5 database connection = cx_Oracle.Connection("pw_report/report@tpri") cursor = connection.cursor() #2.0 database conn=cx_Oracle.Connection("pw_report2/report@tpri") cur=conn.cursor() cursor.execute(Report.selectSql) cursor.rowfactory = Report index=0 isRollback=False for 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 break print "\n insert data: %d" % index if isRollback: conn.rollback() else: conn.commit() conn.close() connection.close() 以上程序,若BLOB字段内容为空,就可以执行通过,若不为空,则无法插入。 在此与大家分享沟通下。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-02
问题已经解决了。
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}) 关键是HTMLTEMPLATE必须是字节数组类型,负责是不能插入数据库的。 因此在执行SQl前,须执行下面这句: htmlBytes=bytes(HTMLTEMPLATE) 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":htmlBytes}) |
|
返回顶楼 | |
发表时间:2010-06-12
夜深,叶动;车灯亮起,过去;漫行,无归属!
|
|
返回顶楼 | |