bytea: Cacheproblem in Postgres-DB

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo zusammen,

ich speichere nach diesem Prinzip eine pdf-Datei in einer Postgres-Datenbank:

Code: Alles auswählen

# Datei einlesen
with open (mypdf,"rb") as f:
	filedata = f.read()
	filedata=filedata.encode("base64")


# DB-Verbindung herstellen
conn = initDBConn()
curs = createCursor(conn)


curs.execute("""UPDATE mytable SET pdfdatei=%(bytea)s;""",{'bytea' : psycopg2.Binary(filedata)})
conn.commit()

# DB-Verbindung schließen
closeConnection(conn)
Soweit funktioniert das auch gut. Nur wenn ich jetzt den Datensatz mit einem anderen pdf überschreiben möchte, habe ich jedes Mal wieder das alte pdf in der Datenbank.

Da das wohl zur Hälfte ein Python- zur anderen Hälfte ein Postgres-Problem ist, habe ich auch in einem Postgres-Forum einen Beitrag dazu veröffentlicht. Dort wird jedoch vermutet, dass pythonseitig vielleicht noch etwas gemacht werden muss.

Hat jemand von euch eine Idee, was ich hier falsch mache?

Vielen Dank für jeden Hinweis,

Andi
lunar

Der erste Fehler ist, dass der gezeigte Quelltext unvollständig ist. Wir können die Implementierung von "initDBConn()", "createCursor()" und "closeConnection()" schließlich nicht erraten, zeige also bitte vollständigen Quelltext, den jeder auch unverändert selbst ausprobieren kann.

Mehr kann man wohl erst sagen, wenn Du diesen Fehler behoben hast.

Ansonsten wäre es noch gut, einen Link zu Deiner entsprechenden Frage in einem Postgres-Forum zu zeigen. Und ist es wirklich Absicht, alle Datensätze der Tabelle zu aktualisieren, oder sollte da nicht noch irgendwo ein "WHERE" stehen?
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo Lunar,

sorry, da hast Du natürlich recht. Hier der restliche Code:

Code: Alles auswählen

from __future__ import with_statement
import sys
import psycopg2
import psycopg2.extensions


def initDBConnection(): 
	dbhost = 'localhost'
	dbname = 'mydb'
	dbport = '5432'
	dbuser = 'myuser'
	dbpass = 'password'

	try:	
		connection = psycopg2.connect("dbname='" + dbname + "' user='" + dbuser + "' host='" + dbhost + "' port='" + dbport + "' password='" + dbpass + "'")
	except psycopg2.Error, e:
		print "Verbindung zur Datenbank konnte mit psycopg2 nicht aufgebaut werden."
		quit(1)
	return connection


def createCursor(connection):													 
	try:	return connection.cursor()
	except psycopg2.Error, e:
		print "Es konnte kein Cursor zur Datenbank gesetzt werden! "
		quit(1)

def closeConnection(connection):													
	connection.close()
Eine WHERE-Klausel habe ich natürlich schon noch drin. Die hab ich nur der Einfachheit halber weggelassen.
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo zusammen,

mein Problem besteht leider immernoch. Hat denn jemand eine Ahnung, was da los sein könnte? Oder braucht ihr noch mehr Informationen?

Viele Grüße, Andi
BlackJack

@andi24: Genug Informationen um nicht raten zu müssen. Wenn zum Beispiel die WHERE-Klausel auf keinen Datensatz zutrifft, dann hat das UPDATE natürlich auch keinen Effekt. Bist Du denn sicher dass Dein WHERE auch tatsächlich auf den gewünschten Datensatz zutrifft!?
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo BlackJack!

Ja, daran kann es leider auch nicht liegen. Ich gehe direkt auf eine id, die es auch sicher gibt.

Viele Grüße, Andi
Antworten