Extraktion von Bytea Feldern aus PostgreSQL Datenbank mittels psycopg2

22/08/2010 - 22:32 von Julia Jacobson | Report spam
Liebe Python Anwender,
Wie kann ich mit einem Python Skirpt unter Verwendung von pscopg2 die
Bytea Felder einer PostgreSQL Datenbank herausziehen und in Dateien auf
einem Client speichern?
Leider konnte ich nur Beispiele für das Einsetzen finden und tue mich
als Anfàngerin noch schwer beim Umschreiben für die Extraktion.
Vielen Dank bereits im Voraus für eure Antworten!
 

Lesen sie die antworten

#1 Gerold Penz
23/08/2010 - 21:59 | Warnen spam
Am 2010-08-22 22:32, schrieb Julia Jacobson:
Wie kann ich mit einem Python Skirpt unter Verwendung von pscopg2 die
Bytea Felder einer PostgreSQL Datenbank herausziehen und in Dateien auf
einem Client speichern?



Hallo Julia!

So:

#!/usr/bin/env python
# coding: utf-8

import psycopg2
import psycopg2.extensions


psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)


def create_table(conn):
"""
Erstellt die Tabelle, falls sie noch nicht existiert
"""

cur = conn.cursor()
sql = """
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
bin_field bytea
);
"""
try:
cur.execute(sql)
conn.commit()
print u"Tabeelle wurde erstellt"
except psycopg2.ProgrammingError:
print u"Tabelle existiert bereits"
conn.rollback()


def insert_file(conn, filename):
"""
Schreibt den Inhalt der übergebenen Datei in die DB
"""

cur = conn.cursor()
sql = """
INSERT INTO test_table (bin_field) VALUES (%s);
"""
with file(filename, "rb") as f:
binary = psycopg2.Binary(f.read())
cur.execute(sql, [binary])
conn.commit()


def read_file(conn, filename):
"""
Liest das Binàrfeld aus und schreibt den Inhalt in die
Datei mit dem übergebenen Namen.
"""

cur = conn.cursor()
sql = """
SELECT bin_field FROM test_table LIMIT 1;
"""
cur.execute(sql)
row = cur.fetchone()
with file(filename, "wb") as f:
f.write(row[0])


def main():

# Connection zur Datenbank öffnen (Unix-Socket)
conn = psycopg2.connect(
database = "testdb",
user = "testdb",
password = "testdb"
)

create_table(conn)
insert_file(conn, "IMG_1067.JPG")
read_file(conn, "IMG_1067_NEW.JPG")
conn.close()


if __name__ == "__main__":
main()

mfg
Gerold
:-)


Gerold Penz - http://halvar.at
Wissen hat eine wunderbare Eigenschaft:
Es verdoppelt sich, wenn man es teilt.

Ähnliche fragen