[PYTHON] [Introduction à cx_Oracle] (16ème) Gestion des types LOB

Table de sérialisation

Série: Introduction à cx_Oracle Contents

Environnement de vérification

--Utilisation d'Oracle Cloud

Préparation préalable

Créez le tableau suivant.

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

Bases du référencement / mise à jour vers le type LOB

Si les données font jusqu'à 1 Go, elles peuvent être traitées comme str pour le type CLOB et octet pour BLOB sans aucune considération particulière comme le type VARCHAR2 et le type RAW. S'il dépasse 1 Go, il doit être traité dans un format de traitement de flux qui traite un montant fixe à la fois. Les performances sont meilleures sans passer par un flux, mais même si une donnée est inférieure à 1 Go, fetchmany () consommera rapidement de la mémoire, donc les ressources mémoire et la quantité de données à récupérer (moyenne) En fonction de l'équilibre taille x nombre d'enregistrements), envisagez le traitement de flux même pour les LOB de petite taille.

Petites mises à jour des données

Dans tous les cas, veuillez préparer les données (fichier) à traiter séparément. Si vous souhaitez exécuter l'exemple de source dans votre propre environnement, veuillez corriger soit le nom du fichier dans la source, soit le nom du fichier préparé. Vous trouverez ci-dessous un exemple de type 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")

Référence pour les petites données

Les références ne sont pas aussi faciles que la mise à jour, et vous devez définir le gestionnaire de type de sortie décrit dans 9th. L'exemple suivant fait référence à l'enregistrement enregistré précédemment et l'enregistre dans un fichier sous un nom différent.

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)

Bien entendu, le contenu des deux fichiers est le même.

$ cmp screenshot1.png screenshot2.png
$

Mise à jour des données à grande échelle

Je vais expliquer basé sur BLOB. La procédure est à peu près la suivante.

  1. Insérez un localisateur vide dans la colonne LOB avec la fonction SQL EMPTY_BLOB ()
  2. Liez le localisateur LOB avec la clause RETURNING de l'instruction INSERT
  3. Diffusez des données vers le localisateur LOB

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()

En dessous, il correspond au numéro du commentaire.

  1. La colonne BLOB utilise la fonction SQL EMPTY_BLOB () pour insérer un localisateur LOB vide. Utilisez ensuite la clause RETURNING pour recevoir le localisateur LOB vide inséré dans la variable de liaison.
  2. Préparez les variables côté Python qui correspondent aux variables de liaison. Nous utilisons Cursor.var () pour spécifier qu'il s'agit d'un BLOB.
  3. Spécifiez la taille du tampon.
  4. Le fichier ouvert est écrit dans la colonne LOB de la taille 3. via le localisateur LOB.

Le déroulement de l'instruction UPDATE est le même, seule l'instruction SQL change. Mettez à jour la colonne LOB avec EMPTY_BLOB ().

Grande référence de données

Je vais expliquer basé sur BLOB. La procédure est à peu près la suivante. C'est plus facile que de mettre à jour.

  1. Liez la colonne LOB (localisateur LOB) dans la liste SELECT
  2. Lire les données du flux vers le localisateur LOB

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

En dessous, il correspond au numéro du commentaire.

  1. SÉLECTIONNEZ la colonne BLOB.
  2. Spécifiez la taille du tampon.
  3. Les données LOB sont écrites dans le fichier ouvert pour chaque taille de 2.

Recommended Posts

[Introduction à cx_Oracle] (16ème) Gestion des types LOB
[Introduction à cx_Oracle] (5e) Gestion des données japonaises
[Introduction à cx_Oracle] (12e) Gestion des exceptions DB
[Introduction à cx_Oracle] (17e) Gestion du type de date
[Introduction à cx_Oracle] (Partie 7) Gestion des variables de liaison
[Introduction à cx_Oracle] Présentation de cx_Oracle
[Introduction à cx_Oracle] (8e) version de cx_Oracle 8.0
[Cx_Oracle Primer] (Partie 3) Bases de la navigation dans les tableaux
[Introduction à cx_Oracle] (Partie 11) Bases de l'exécution PL / SQL
Série: Introduction à cx_Oracle Contents
[Introduction à cx_Oracle] (Partie 4) Récupération et défilement du jeu de résultats
[Introduction à cx_Oracle] (10e) Instruction Update DML et DDL / DCL
[Introduction à cx_Oracle] (Partie 2) Principes de base de la connexion et de la déconnexion à Oracle Database
[Introduction à l'application Udemy Python3 +] 65. Gestion des exceptions
Introduction à Scapy ① (De l'installation à l'exécution de Scapy)
[Introduction au Data Scientist] Bases de Python ♬
[Introduction à cx_Oracle] (15e) Création d'un jeu de résultats dans un format autre que tapple
[Introduction à Udemy Python3 + Application] 26. Copie du dictionnaire
[Python] Comment utiliser deux types de type ()
[Introduction à Udemy Python3 + Application] 19. Copie de la liste
De l'introduction de pyethapp à l'exécution du contrat
[Introduction à Python] Utilisation de base des expressions lambda
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction de scikit-Optimize
Introduction à Tkinter 1: Introduction
Introduction de PyGMT
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
Introduction à l'apprentissage automatique ~ Montrons le tableau de la méthode du K plus proche voisin ~ (+ gestion des erreurs)
Introduction à Scrapy (4)
Introduction à discord.py (2)
Introduction de Python
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
[Introduction à Udemy Python3 + Application] 53. Dictionnaire des arguments de mots-clés
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
[Introduction à Udemy Python3 + Application] 52. Tapple d'arguments positionnels
[Introduction à cx_Oracle] (13e) Connexion utilisant le pool de connexions (côté client)
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage