代码之家  ›  专栏  ›  技术社区  ›  wolφi

如何用python在oracle中插入blob?

  •  0
  • wolφi  · 技术社区  · 8 年前

    我正在尝试使用cx_oracle 6.3在oracle 12中插入许多blob(每个2到20 MB)。

    经过大量的搜索和实验,我得到了以下代码工作。我是python新手,想知道:这种方法有效吗?有更快的方法吗?

    #!/usr/local/bin/python3
    import io
    import os
    import cx_Oracle
    
    pdf = open('hello.pdf', 'rb')
    mem_file = io.BytesIO(pdf.read())
    mem_file.seek(0, os.SEEK_END)
    file_size = mem_file.tell()
    
    con = cx_Oracle.connect("user", "***", "localhost:1512/ORCLPDB1", encoding="UTF-8")
    
    # create table for this example
    con.cursor().execute("CREATE TABLE t (id NUMBER, b BLOB) LOB(b) STORE AS SECUREFILE(COMPRESS)");
    
    # prepare cursor
    cursor = con.cursor()
    my_blob = cursor.var(cx_Oracle.BLOB, file_size)
    my_blob.setvalue(0, mem_file.getvalue())
    
    # execute insert
    cursor.execute("INSERT INTO t(id, b) VALUES (:my_id, :my_blob)", (1, my_blob))
    con.commit()
    
    con.close()
    

    插入一个 EMPTY_BLOB() 做一个 UPDATE 以后呢?在插入之前计算blob的大小有必要/有益吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Anthony Tuininga    8 年前

    你可以做一些简单得多的事情,也会快得多。请注意,这种方法仅在能够将整个文件内容存储在连续内存中且当前硬限制为1 GB时才起作用,即使您有许多TB的RAM可用!

    cursor.execute("insert into t (id, b) values (:my_id, :my_blob)",
            (1, mem_file.getvalue())
    

    插入一个空的blob()值并返回lob定位器以备以后更新,这比创建一个临时lob并插入它(正如您在代码中所做的那样)更快,但是直接插入数据甚至更快!