psycopg2: TypeError bei select Abfrage

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
timo
User
Beiträge: 2
Registriert: Mittwoch 2. Januar 2008, 14:45

Hallo Leute,

ich bin noch recht in der Programmierung mit Python und schreibe grade ein kleines Script was mit Daten aus einer CSV Datei in eine PostgreSQL Datenbank schreibt. Ich will vorher prüfen, ob eine Zeile bereits existiert um dann ggfls. ein UPDATE statt eines INSERT's auszuführen.

Die Zeile erkenne ich an der ersten Spalte die z.B. den Namen id hat. Hier mein Codeschnipsel:

Code: Alles auswählen

conn = psycopg2.connect("dbname=datenbank")
cursor = conn.cursor()

suchid = '3481277,3'
query = cursor.execute("""select id from column where id=%s""", suchid)

sqlresult = cursor.fetchall()
print sqlresult
Beim Ausführen des Scripts bekomme ich folgenden Fehler:
TypeError: not all arguments converted during string formatting

Was mache ich falsch? Kommt psycodb2 mit dem String nicht zurecht?

Für Eure Hilfe bin ich euch sehr dankbar!

Timo
BlackJack

Das zweite Argument von `execute()` muss eine Sequenz sein. Du hast eine Zeichenkette übergeben, dass ist eine Sequenz von Zeichen, also versucht das DB-Modul da jetzt 9 Argumente in die SQL-Abfrage zu setzen, wo aber nur ein Platzhalter ist. Dat jeht nich :-)

Mach aus dem zweiten Argument einfach ein Tupel mit der Zeichenkette als Element.
timo
User
Beiträge: 2
Registriert: Mittwoch 2. Januar 2008, 14:45

Wenn ich das richtig verstanden habe, mache ich aus:

Code: Alles auswählen

suchid = '3481277,3'
einfach so einen Tupel:

Code: Alles auswählen

suchid = ( '3481277,3' )
Falls richtig, dann bekomme ich den selben Fehler ;)
Der Wert den ich in der DB suche (also der String) hat wirklich ein Komma, vielleicht ist das das Problem?
BlackJack

Das ist einfach nur eine Zeichenkette in Klammern. Tupel werden durch Kommata erzeugt, also

Code: Alles auswählen

suchid = '3481277,3',
Allerdings würde ich das im Aufruf von `execute()` machen und nicht bei der Zuweisung zu dem Namen. Beim Aufruf von `execute()` braucht man dann natürlich zusätzlich zum Komma noch Klammern, damit eindeutig ist, welche Kommata zum Tupel und welche zur Trennung von Argumenten da sind.
Antworten