zoukankan      html  css  js  c++  java
  • python blob操作

    最近在学习使用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_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 " insert data: %d" % index
    if isRollback:
    conn.rollback()
    else:
    conn.commit()
    conn.close()
    connection.close()



    以上程序,若BLOB字段内容为空,就可以执行通过,若不为空,则无法插入。


    在此与大家分享沟通下。

  • 相关阅读:
    Java从零开始学二十一(集合List接口)
    Java从零开始学二十(集合简介)
    初识软件工程一
    JAVA中AES对称加密和解密
    java中的数据加密
    Redis哨兵
    Nginx
    Zuul介绍
    ELK快速搭建日志平台
    Kibana安全特性之权限控制
  • 原文地址:https://www.cnblogs.com/ruiy/p/11753413.html
Copyright © 2011-2022 走看看