Filter bei MySql setzen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,

ich möchte eine Datenbankabfrage machen und dabei den Filter des aktuellen Jahres setzen.

Code: Alles auswählen

import MySQLdb as mdb
import time
import datetime


x_jahr = time.strftime("%Y") 


con = mdb.connect('192.168.0.200', 'root', '', 'Steuerung');
print "x_jahr: ", x_jahr
with con:
    cur = con.cursor()
    cur.execute('SELECT Jahr, Pumpe_an, Solar_an, Dach_min, Dach_max, Prozessor_min, Prozessor_max, Sonstiges FROM Statistik where Jahr = (%s)', (x_jahr))
    result = cur.fetchall()
    print "result: ", result
und erhalte diesen Fehler:

query = query % args
TypeError: not all arguments converted during string formatting

Wie muss ich meine Variable umformatieren?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Soi wie ich das sehe, ist der SQL-Ausdruck nicht korrekt. Das %s darf nicht in Klammern sterhen.

Dafür müsste der 2. Parameter von exeucute iterierbar sein - also in deinem Fall meinst du eine Liste. Etwas in Klammern zu setzen, macht es aber noch nicht zu einer. Elemente mit Kommata getrennt in Klammern sind jedoch eine Liste. (x_jahr,).
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Ich habe die Klammer weggenommen. Das hat aber leider nichts gebracht
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Duesentrieb: Das zweite Argument von `executable()` muss eine Sequenz mit so vielen Elementen sein wie Platzhalter in der SQL-Anweisung sind. Du hast da ``(x_jahr)`` stehen, was das selbe ist wie ``x_jahr``, weil die Klammern da nix bedeuten. Und wenn ``x_jahr`` eine Zeichenkette mit vier Zeichen ist, dann ist das eine Sequenz mit vier Elementen – eines pro Ziffer – da ist aber nur ein Platzhalter. Du musst da also entweder ein Tupel übergeben ``(x_jahr,)`` – man beachte das KOMMA!!!, oder eine Liste ``[x_jahr]``.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

He, super
Es wundert mich nur dass es bis vor ein paar Wochen noch ohne das Komma funktioniert hat

Danke!
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Duesentrieb: Das kann nicht sein. Diese API hat seit 2002 den Status „Final“, da hat sich sicher nicht in den letzten paar Wochen so etwas grundlegendes bei einer Implementierung geändert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten