Python PostgreSQL BLOB | insérer et récupérer des fichiers/images
Dans ce tutoriel nous allons découvrir comment insérer et récupérer un fichier BLOB stocké dans une table PostgreSQL à l’aide du module intégré psycopg2.
PostgreSQL ne prend pas en charge BLOB mais vous pouvez utiliser le type de données BYTEA pour stocker les données binaires.
Utilisez le type de données BYTEA pour stocker toutes les données binaires dans une table PostgreSQL à l’aide de Python. Le fichier binaire peut être un fichier, une image, une vidéo ou un média.
Avant d’exécuter les programmes Python suivants, assurez-vous de connaître le nom de la table PostgreSQL et les détails de la colonne dans lequel vous souhaitez stocker les données BLOB. Pour stocker des données BLOB dans une table PostgreSQL, nous devons créer une table pouvant contenir des données binaires, ou vous pouvez également modifier n’importe quelle table existante et ajouter une colonne avec BYTEA comme type de données.
Pour ce tutoriel, nous allons utiliser la table « person » présente dans notre base de données PostgreSQL.
Si aucune table n’est présente dans votre base de données PostgreSQL, veuillez créer une table PostgreSQL et insérer des données dans la table PostgreSQL avec Python.
Vous pouvez utiliser la requête suivante pour créer une table avec une colonne BYTEA:
CREATE TABLE person ( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, file BYTEA NOT NULL );
Avant de commencer, comprenons d’abord ce qu’est BYTEA.
Qu’est-ce que BYTEA
Un BYTEA est un type de données qui peut être utilisé pour stocker de gros objets, généralement des fichiers volumineux tels que des images, de la musique, des vidéos, des documents, des pdf, etc. Nous devons convertir nos fichiers et images en données binaires, c’est-à-dire, tableau d’octets en Python pour stocker et récupérer à partir de la base de données PostgreSQL.
Les étapes pour insérer des fichiers BLOB avec Python
Pour l’instant, la table « person » est vide, pour insérer des données BLOB dans la table PostgreSQL, vous devez suivre les étapes suivantes:
- Tout d’abord, établissez une connexion PostgreSQL à partir de Python.
- Ensuite, créez un objet curseur à l’aide de l’objet de connexion.
- Après, exécutez la requête INSERT à l’aide de curseur.execute(). Pour les données BLOB, vous utilisez l’objet binaire du module psycopg
- Après l’exécution réussie d’une requête PostgreSQL, n’oubliez pas de valider vos modifications dans la base de données.
- Fermez la connexion à la base de données PostgreSQL.
- N’oubliez pas non plus de détecter les exceptions PostgreSQL, le cas échéant.
Regardons maintenant le programme.
import psycopg2 def insertBLOB(id, name, file): try: conn = psycopg2.connect( user = "postgres", password = "admin", host = "localhost", port = "5432", database = "my_db" ) cur = conn.cursor() sql = "INSERT INTO person (id, name, file) VALUES (%s, %s, %s)" # lire les données du fichier myfile = open(file, 'rb').read() cur.execute(sql,(id, name, psycopg2.Binary(myfile))) # valider l'insertion dans la base de données conn.commit() #fermeture de la connexion à la base de données cur.close() conn.close() print("La connexion PostgreSQL est fermée") except (Exception, psycopg2.Error) as error : print ("Erreur lors de l'insertion.", error) insertBLOB(1, "Alex", "C:\\Users\\Thomas\\Desktop\\file.txt")
Les étapes pour récupérer des fichiers BLOB avec Python
Pour lire les données BLOB à partir d’une table PostgreSQL avec Python, vous devez suivre les étapes suivantes:
- Tout d’abord, établissez une connexion PostgreSQL à partir de Python.
- Deuxièmement, définissez la requête SELECT pour extraire les colonnes BLOB de la table.
- Exécutez la requête SELECT à l’aide de cursor.execute()
- Utilisez cursor.fetchall() pour récupérer toutes les lignes et itérer dessus.
- Convertir des données BLOB au format approprié et l’écrire sur le disque dans un format correct.
- Fermez la connexion de la base de données.
Regardons maintenant le programme.
import psycopg2 def getFile(id): try: conn = psycopg2.connect( user = "postgres", password = "admin", host = "localhost", port = "5432", database = "my_db" ) cur = conn.cursor() sql = "SELECT * FROM person WHERE id = %s" cur.execute(sql, (id,)) res = cur.fetchall() for colon in res: name = colon[1] file = colon[2] print("Stocker le fichier sur le disque \n") path = "C:\\Users\\Thomas\\Desktop\\" + name + ".txt" # Convertir les donnees binaires au format # approprie et les ecrire sur le disque dur with open(path, 'wb') as myfile: myfile.write(file) print("Le fichier stockees dans: ", path, "\n") #fermeture de la connexion à la base de données cur.close() conn.close() print("La connexion PostgreSQL est fermée") except (Exception, psycopg2.Error) as error : print ("Erreur lors de l'insertion.", error) getFile(1)
Sortie:
Stocker le fichier sur le disque ('Le fichier stockees dans: ', 'C:\\Users\\Thomas\\Desktop\\Alex.txt', '\n') Connexion PostgreSQL est fermee
Super !
Une explication claire et un code complet.
Merci pour votre aide sur un sujet où la doc n’est pas si facile que ça à trouver