`
pangyi
  • 浏览: 33666 次
  • 性别: Icon_minigender_1
  • 来自: 古城西安
社区版块
存档分类
最新评论

Python如何操作Oracle的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 "\n insert data: %d" % index
if isRollback:
    conn.rollback()
else:
    conn.commit()
conn.close()
connection.close()



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


在此与大家分享沟通下。

分享到:
评论
2 楼 zxp8216 2010-06-12  
夜深,叶动;车灯亮起,过去;漫行,无归属!
1 楼 pangyi 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})
 

相关推荐

    ORACLE中BLOB字段导入到SQL SERVER中的IMAGE字段

    1. **数据准备**:确保ORACLE数据库中的BLOB字段包含所需的数据,并且是完整的。可能需要进行数据验证,以确保所有数据都能被正确读取。 2. **数据导出**:使用ORACLE提供的工具,如SQL*Plus或者PL/SQL Developer,...

    Oracle照片导出

    Blob字段类型是Oracle提供的一种存储大数据的方法,适用于存储非文本信息。在Oracle中,Blob字段可以存储高达4GB的数据。 该工具的核心功能包括: 1. **指定表名**:用户可以输入想要导出照片的表名。在Oracle...

    图片存入Oracle中,用clob和blob两种方式

    - **准备环境**:首先确保已经安装了Oracle数据库客户端和相应的驱动程序,例如JDBC驱动,以便通过编程语言(如Java、Python等)与数据库交互。 - **连接数据库**:使用相应的连接字符串、用户名和密码建立与...

    BlobRead.py

    python 查询oracle数据blob字段,需要安装python扩展工具cx_Oracle,选择的时候一定要注意python、cx_Oracle、oracle client的版本,一定要一一对应

    oracle字段类型转换的处理

    在Oracle数据库中,字段类型转换是一项常见的操作,特别是在数据迁移、数据清洗或处理来自不同数据源的数据时。本文将深入探讨Oracle字段类型的转换方法,并提供一个实用的工具示例。 Oracle数据库支持多种数据类型...

    Oracle bolb 文件导出

    Oracle BLOB字段用于存储非结构化的二进制数据,最大可存储4GB的数据。在数据库设计中,当需要存储大文件时,BLOB类型是理想的选择。 2. **导出BLOB数据** 导出BLOB数据通常涉及查询数据库,获取BLOB字段的二进制...

    Oracle照片的读取写入

    1. **创建表结构**:首先,你需要创建一个包含BLOB字段的表来存储照片。例如,可以创建一个名为PHOTO_STORAGE的表,包含一个ID字段和一个BLOB类型的PHOTO字段。 ```sql CREATE TABLE PHOTO_STORAGE ( ID NUMBER ...

    2014年辛星Python数据库Sqlite3教程

    Python的sqlite3模块提供了一系列操作数据库的接口,允许Python程序通过简单的API调用来执行SQL语句,从而实现数据库的操作。这些操作不仅包括基本的增删改查,还可以进行复杂的查询和事务管理。在Python中使用...

    odi10g大字段知识模块

    1. **KM_IKM Oracle Incremental Update Lob**: 这个KM(Knowledge Module)是ODI中的操作组件,它实现了Oracle数据库中BLOB字段的增量更新。这意味着只有当源数据发生变化时,ODI才会更新目标数据库中的BLOB字段,...

    一个完整的数据库图片字段转化为本地图片的例子

    1. **BLOB数据类型**:学习如何在不同数据库系统(如MySQL、SQL Server、Oracle等)中创建和操作BLOB字段,了解其限制和性能影响。 2. **图片编码与解码**:图片在数据库中存储前,通常会被编码成常见的格式如JPEG...

    ODI SQL Server到Oracle数据库的照片集成.doc

    【知识点详解】 ...通过上述过程,ODI 使用 Jython 脚本实现了 SQL Server 中 `image` 类型数据到 Oracle 数据库 Blob 字段的转换。这种转换处理了数据类型差异,确保了二进制数据完整无损地迁移。

    照片批量导入导出

    了解SQL语句的编写,特别是对于BLOB字段的SELECT和INSERT操作,是关键所在。 8. **适应其他数据库**:描述提到该方法可以简单修改后应用于其他数据库,这意味着代码可能采用了数据库无关的接口或者设计模式,如使用...

    保存图片到数据库 delphi

    对于Oracle数据库,图片可以存储在BLOB(Binary Large Object)类型字段中。以下是一个简单的Delphi代码示例,展示如何将图片保存到Oracle数据库: ```delphi uses OracleDB, DB, DBClient; var Oracle...

    图片以二进制保存到Oracle,取出并显示到页面示例

    在Oracle数据库中,我们创建了一个名为`images`的表,包含`id`和`image_data`两个字段,其中`image_data`字段是BLOB类型,用于存储图片的二进制数据。 当需要从数据库中取出图片并显示在网页上时,可以使用类似的...

    数据库表数据迁移

    - 使用合适的数据库连接库,如Python的`pymysql`和`cx_Oracle`。 - 定义配置,包括数据库连接信息、表名、字段映射等。 - 实现数据读取、转换和写入的逻辑,确保错误处理和事务控制。 - 提供扩展接口,方便添加...

    计算机软件-商业源码-将图片写入数据库并显示.zip

    - 数据库操作:创建包含BLOB字段的表结构,编写SQL语句插入图片字节流,查询时将BLOB字段转换回图片格式。 - 图片处理:可能需要使用图像处理库(如OpenCV、PIL)对图片进行预处理,例如缩放、压缩,以减小存储...

    将多媒体文件保存到数据库中,或将数据库中的多媒体文件显示出来

    这通常涉及文件流的读取和写入操作,使用编程语言如Java、Python或C#的相应库函数。 4. **数据库设计**:为了有效地管理多媒体文件,数据库设计中通常会创建专门的表来存储文件元数据,如文件名、文件类型、创建...

    数据库读入、读出图片资料

    当用户上传图片时,我们需要将图片文件转换为字节流,然后保存到数据库对应的BLOB字段。这个过程通常涉及文件读取、字节转换和数据库插入操作。例如,使用Python的`open()`函数读取图片,再通过`io.BytesIO`将文件...

    如何存取数据库图像字段.rar_图像 数据库_数据存取

    一是将图像文件存储在数据库内部,即直接将图像文件内容作为BLOB字段的值;二是存储图像的路径或URL,而不是实际的图像数据,这样图像文件可以存储在文件系统或其他云存储服务中,数据库只保存引用。 3. **数据库...

Global site tag (gtag.js) - Google Analytics