[PYTHON] [Einführung in cx_Oracle] (16.) Umgang mit LOB-Typen

Serialisierungstabelle

Serie: Einführung in den Inhalt von cx_Oracle

Überprüfungsumgebung

Vorbereitungen

Erstellen Sie die folgende Tabelle.

SQL> create table sample16(col1 number, col2 blob);

Grundlagen der Referenzierung / Aktualisierung auf den LOB-Typ

Wenn die Daten bis zu 1 GB groß sind, können sie ohne besondere Berücksichtigung wie VARCHAR2-Typ und RAW-Typ als str für den CLOB-Typ und als Byte für den BLOB behandelt werden. Wenn es 1 GB überschreitet, muss es in einem Stream-Verarbeitungsformat verarbeitet werden, das jeweils einen festen Betrag verarbeitet. Die Leistung ist besser, ohne einen Stream zu durchlaufen, aber selbst wenn eine Daten weniger als 1 GB groß sind, verbraucht fetchmany () schnell Speicher, sodass Speicherressourcen und die abzurufende Datenmenge (Durchschnitt) Berücksichtigen Sie je nach Gleichgewicht zwischen Größe und Anzahl der Datensätze die Stream-Verarbeitung auch für kleine LOBs.

Kleine Datenaktualisierungen

Bereiten Sie in jedem Fall die Daten (Datei) vor, die separat verarbeitet werden sollen. Wenn Sie die Beispielquelle in Ihrer eigenen Umgebung ausführen möchten, korrigieren Sie entweder den Dateinamen in der Quelle oder den Namen der vorbereiteten Datei. Unten finden Sie ein Beispiel für den Typ INSERT to BLOB.

sample16a.py


import cx_Oracle

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
    insert into sample16 values(1, :blobdata)
"""

with open('screenshot1.png', 'rb') as f:
    image = f.read()

with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
    with connection.cursor() as cursor:
        cursor.execute(SQL, blobdata=image)
        cursor.execute("commit")

Referenz für kleine Daten

Referenzen sind nicht so einfach wie das Aktualisieren, und Sie müssen den in 9th beschriebenen Ausgabetyp-Handler definieren. Das folgende Beispiel bezieht sich auf den zuvor registrierten Datensatz und speichert ihn in einer Datei mit einem anderen Namen.

sample16b.py


import cx_Oracle

def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
    if defaultType == cx_Oracle.DB_TYPE_BLOB:
        return cursor.var(cx_Oracle.DB_TYPE_LONG_RAW, arraysize=cursor.arraysize)

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
    select col2 from sample16 where col1 = 1
"""

with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
    connection.outputtypehandler = OutputTypeHandler
    with connection.cursor() as cursor:
        cursor.execute(SQL)
        lobdata, = cursor.fetchone()
with open('screenshot2.png', 'wb') as f:
    f.write(lobdata)

Natürlich ist der Inhalt beider Dateien gleich.

$ cmp screenshot1.png screenshot2.png
$

Datenaktualisierung in großem Maßstab

Ich werde anhand von BLOB erklären. Das Verfahren ist ungefähr wie folgt.

  1. Fügen Sie mit der SQL-Funktion EMPTY_BLOB () einen leeren Locator in die LOB-Spalte ein.
  2. Binden Sie den LOB-Locator mit der RETURNING-Klausel der INSERT-Anweisung
  3. Streamen Sie Daten in den LOB-Locator

sample16c.py


import cx_Oracle

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
    insert into sample16 values(2, empty_blob())
    returning col2 into :blobdata
""" # [1.]


with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
    with connection.cursor() as cursor:
        blobdata = cursor.var(cx_Oracle.DB_TYPE_BLOB) # [2.]
        cursor.execute(SQL, [blobdata])
        blob, = blobdata.getvalue()
        offset = 1
        bufsize = 65536 # [3.]
        with open('screenshot1.png', 'rb') as f: # [4.]
            while True:
                data = f.read(bufsize)
                if data:
                    blob.write(data, offset)
                if len(data) < bufsize:
                    break
                offset += bufsize
    connection.commit()

Unten entspricht es der Kommentarnummer.

  1. Die BLOB-Spalte verwendet die SQL-Funktion EMPTY_BLOB (), um einen leeren LOB-Locator einzufügen. Verwenden Sie dann die RETURNING-Klausel, um den eingefügten leeren LOB-Locator in der Bindevariablen zu erhalten.
  2. Bereiten Sie die Python-seitigen Variablen vor, die den Bindevariablen entsprechen. Wir verwenden Cursor.var (), um anzugeben, dass es sich um ein BLOB handelt.
  3. Geben Sie die Größe des Puffers an.
  4. Die geöffnete Datei wird über den LOB-Locator mit der Größe 3 in die LOB-Spalte geschrieben.

Der Ablauf der UPDATE-Anweisung ist derselbe, nur die SQL-Anweisung ändert sich. Aktualisieren Sie die LOB-Spalte mit EMPTY_BLOB ().

Große Datenreferenz

Ich werde anhand von BLOB erklären. Das Verfahren ist ungefähr wie folgt. Es ist einfacher als zu aktualisieren.

  1. Binden Sie die LOB-Spalte (LOB-Locator) in die SELECT-Liste
  2. Lesen Sie die Daten im Stream zum LOB-Locator

sample16d.py


import cx_Oracle

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
    select col2 from sample16 where col1 = 2
""" # [1.]


with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
    with connection.cursor() as cursor:
        cursor.execute(SQL)
        blob, = cursor.fetchone()
        offset = 1
        bufsize = 65536 # [2.]
        with open('screenshot3.png', 'wb') as f: # [3.]
            while True:
                data = blob.read(offset, bufsize)
                if data:
                    f.write(data)
                if len(data) < bufsize:
                    break
                offset += bufsize

Unten entspricht es der Kommentarnummer.

  1. Wählen Sie die Spalte BLOB.
  2. Geben Sie die Größe des Puffers an.
  3. LOB-Daten werden für jede Größe von 2 in die geöffnete Datei geschrieben.

Recommended Posts

[Einführung in cx_Oracle] (16.) Umgang mit LOB-Typen
[Einführung in cx_Oracle] (5.) Umgang mit japanischen Daten
[Einführung in cx_Oracle] (12.) DB-Ausnahmebehandlung
[Einführung in cx_Oracle] (17.) Datumsbehandlung
[Einführung in cx_Oracle] (Teil 7) Umgang mit Bindevariablen
[Einführung in cx_Oracle] Übersicht über cx_Oracle
[Einführung in cx_Oracle] (8.) Version cx_Oracle 8.0
[Cx_Oracle Primer] (Teil 3) Grundlagen zum Durchsuchen von Tabellen
[Einführung in cx_Oracle] (Teil 11) Grundlagen der PL / SQL-Ausführung
Serie: Einführung in den Inhalt von cx_Oracle
[Einführung in cx_Oracle] (Teil 4) Abrufen und Scrollen der Ergebnismenge
[Einführung in cx_Oracle] (10.) Aktualisieren Sie die DML-Anweisung und die DDL / DCL-Anweisung
[Einführung in cx_Oracle] (Teil 2) Grundlagen zum Verbinden und Trennen mit Oracle Database
[Einführung in die Udemy Python3 + -Anwendung] 65. Ausnahmebehandlung
Einführung in Scapy ① (Von der Installation bis zur Ausführung von Scapy)
[Einführung in Data Scientist] Grundlagen von Python ♬
[Einführung in cx_Oracle] (15.) Erstellen einer Ergebnismenge in einem anderen Format als tapple
[Einführung in die Udemy Python3 + -Anwendung] 26. Kopie des Wörterbuchs
[Python] Verwendung von zwei Arten von type ()
[Einführung in die Udemy Python3 + -Anwendung] 19. Kopie der Liste
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
[Einführung in Python] Grundlegende Verwendung von Lambda-Ausdrücken
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung von Scikit-Optimize
Einführung in Tkinter 1: Einführung
Einführung von PyGMT
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in das maschinelle Lernen ~ Zeigen wir die Tabelle der K-Methode für den nächsten Nachbarn ~ (+ Fehlerbehandlung)
Einführung in Scrapy (4)
Einführung in discord.py (2)
Einführung von Python
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
[Einführung in Udemy Python3 + Application] 53. Wörterbuch der Schlüsselwortargumente
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
[Einführung in Udemy Python3 + Application] 52. Tapple von Positionsargumenten
[Einführung in cx_Oracle] (13.) Verbindung über Verbindungspool (Client-Seite)
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung