sqlite3 suchen mit variabeln

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
nurmili
User
Beiträge: 6
Registriert: Sonntag 16. August 2015, 08:03

Hallo Leute, ich bin neu in der Python programmierung !
Ich bräuchte mal eure Hilfe.
Aufgabenstellung:
Ich habe eine Datenbank mit dem Namen "nutzer.db" und die Tabelle "fueller".
In der Tabelle gibts eine Spallte "kennung" in der eine 10stellige Nummer steht.
Ich lese einen RFID Chip in eine Variabel und möchte diese Variabel in der Spalte
"kennung" suchen. Ob die Nummer vorhanden ist möchte ich mit IF - Else auswerten.
Folgender Code funktioniert. Aber ich möchte ja anstatt `0003839146` hier eine Variabel
einsetzen und das bekomme ich nicht hin.
Im voraus vielen Dank für eure Hilfe

import sqlite3
con = sqlite3.connect("nutzer.db")
dbcursor = con.cursor()
dbcursor.execute("SELECT * FROM `fueller` WHERE `kennung` = '0003839146' ")
for datensatz in dbcursor:
print(datensatz)

con.close()
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@nurmili: dafür gibt es in der Dokumentation im ersten Abschnitt ein Beispiel.
nurmili
User
Beiträge: 6
Registriert: Sonntag 16. August 2015, 08:03

Habs versucht !!
und zwar so:

import sqlite3
con = sqlite3.connect("nutzer.db")
dbcursor = con.cursor()
ke = ('0003839146 ',)
dbcursor.execute('SELECT * FROM fueller WHERE ke=?', ke)
print(dbcursor.fetchone())
con.close()

und habe folgende Fehlermeldung bekommen :

Traceback (most recent call last):
File "abfragen4.py", line 10, in <module>
dbcursor.execute('SELECT * FROM fueller WHERE ke=?', ke)
sqlite3.OperationalError: no such column: ke


Was mach ich falsch ???? :cry:
BlackJack

@nurmili: Heisst die Datenbankspalte den `ke`? Wohl kaum, denn sonst hättest Du nicht diese Fehlermeldung bekommen. Die heisst in Deinem ersten Beitrag auch noch `kennung`. Und so sollte sie auch heissen wenn Du das Schema in der Hand hast, denn kryptische Abkürzungen für Namen sollten nicht sein.
nurmili
User
Beiträge: 6
Registriert: Sonntag 16. August 2015, 08:03

Hallo Black Jack

du hast natürlich recht !!!!!!!
So funktionierts:

import sqlite3

con = sqlite3.connect("nutzer.db")
dbcursor = con.cursor()

ke = ('0003839146',)

dbcursor.execute('SELECT * FROM fueller WHERE kennung=?', ke)
print(dbcursor.fetchone())

con.close()


Vieeeeeeelen dank !!!!!!! :wink: :wink:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Fuer die Zukunft: Bitte benutze Python-Tags fuer deinen Code, dafuer gibt es ueber dem Eingabefeld einen Button namens "Code".
nurmili
User
Beiträge: 6
Registriert: Sonntag 16. August 2015, 08:03

Hallo Leute,
eine Frage hätte ich noch !

Folgender Code läuft:

Code: Alles auswählen

import sqlite3

con = sqlite3.connect("nutzer.db")
dbcursor = con.cursor()

ke = ("0003839146",)

dbcursor.execute('SELECT * FROM fueller WHERE kennung=?', ke)

a = (dbcursor.fetchone())

if a == None:
	print ("Chip nicht registriert")
else:
	print ("Zugang ok")


con.close()
Wenn ich aber die Zeile 6
ke = ("0003839146",)
durch
ke = input()
ersetze , und über die Tastaur eingebe bekomme ich folgende Fehlermeldung:

dbcursor.execute('SELECT * FROM fueller WHERE kennung=?', ke)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 10 supplied.

Wo ist denn der Unterschied zwischen
ke = ("0003839146",) und ke = input() ???????

Wenn ich das noch gelöst bekomme, denk ich, dann hab ichs !

nochmal vielen Dank im voraus !
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Der Unterschied ist, dass das funktionierende `ke` ein Tupel ist und das Ergebnis von `input` ein String (wenn du Python3 benutzt, wenn nicht solltest du `raw_input` benutzen).

Demenstrechend muss das `execute` so lauten:

Code: Alles auswählen

dbcursor.execute('SELECT * FROM fueller WHERE kennung=?', (ke,))
nurmili
User
Beiträge: 6
Registriert: Sonntag 16. August 2015, 08:03

Du bist genial !!!!!!!!
Es funktioniert !!!! :lol: :lol: :lol:
Einfach ein geiles Forum !
Antworten