从Oracle BLOB数据使用Python为文本文件(Blob data from Oracle

2019-09-27 18:06发布

我一直在试图从Oracle BLOB数据进入使用Python的文本文件。 我找不到任何其他环节的答案。

下面是我的代码:

sql_string = """select 
   event_id
   ,blob_length
   ,blob field
from table"""

  cur.execute(sql_string)
    path = "P:/Folders/"

    for row in cur:
        filename = path +  "notes_" + str(row[0]) + "_" + str(row[1]) + ".txt"      
        f = codecs.open(filename, encoding='utf-8', mode='wb+')
        f.write(row[2])
        f.close()

我得到下面的错误

TypeError: utf_8_encode() argument 1 must be str, not cx_Oracle.LOB

我已经尝试了一些其他的方式,但问题是,我只看到,甚至其他方式处理字符串,而不是斑点。

Answer 1:

你必须使用cx_oracle.LOB.read()方法来获取内容LOB对象:

f.write(row[2].read())


Answer 2:

执行哪些@blhsing建议它完美地工作了

    for row in cur:
        filename = path +  "notes_" + str(row[0]) + "_" + str(row[1]) + ".txt"      
        print(row[2].read())
        f = open(filename, "wb")
        f.write(row[2].read())
        f.close()        


Answer 3:

如果您的LOB足够小,以适应在内存中,如果你取的BLOB作为LONG_BINARY你会得到更好的性能(与使用CLOB的LONG_STRING):

def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
    if defaultType == cx_Oracle.CLOB:
        return cursor.var(cx_Oracle.LONG_STRING, arraysize = cursor.arraysize)
    if defaultType == cx_Oracle.BLOB:
        return cursor.var(cx_Oracle.LONG_BINARY, arraysize = cursor.arraysize)

见在cx_Oracle例如https://github.com/oracle/python-cx_Oracle/blob/master/samples/ReturnLobsAsStrings.py



文章来源: Blob data from Oracle to text file using python