Daten aus DB in einen Array speichern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
danohomie
User
Beiträge: 5
Registriert: Samstag 18. Februar 2017, 17:47

Hallo :)

Ich möchte Daten aus der Sqlite3 DB auslesen und diese in einen Array in Python schreiben. Momentan habe ich folgenden Ansatz:

Code: Alles auswählen

#Verbindung aufbauen
con = sqlite3.connect('test.db')

with con:
	cur= con.cursor()
	#Abfrage von DB
	cur.execute("SELECT name, MAC FROM Besucher")

	while True:
		row = cur.fetchone()

		if row == None:
			break

	#Und hier sollen die Daten in den Arrays "besucher" und "adresse" gespeichert werden. Leider funktioniert das nicht.
	besucher = row[0]
	adresse = row[1]
Fehlermeldung: TypeError: 'NoneType' object has no attribute '__getitem__' :K

Ich freue mich über eure Tips und Ratschläge :)

Dani
Zuletzt geändert von Anonymous am Samstag 18. Februar 2017, 19:10, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du hast die Schleife so programmiert, dass sie endet, wenn "row" None ist. Wieso sollte anschließend plötzlich etwas anderes als None an "row" gebunden sein? Und viel wichtigere Frage: Was hättest du in "row" an der Stelle erwartet?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@danohomie: die Fehlermeldung ist doch klar. Du beendest die while-Schleife erst, wenn `row` None ist, und None erlaubt eben keinen Indexzugriff. Es ist übrigens unschön, wenn man zusammengehörige Daten in getrennten Listen (nicht Arrays) speichern will. Nimm eine Liste, wo jeder Eintrag ein Tuple mit (name, adresse) ist:

Code: Alles auswählen

#Verbindung aufbauen
con = sqlite3.connect('test.db')

with con:
    cur = con.cursor()
    cur.execute("SELECT name, mac FROM Besucher")
    besucher_mit_adresse = cur.fetchall()
Eingerückt wird übrigens mit 4 Leerzeichen pro Ebene.
danohomie
User
Beiträge: 5
Registriert: Samstag 18. Februar 2017, 17:47

snafu hat geschrieben:Du hast die Schleife so programmiert, dass sie endet, wenn "row" None ist. Wieso sollte anschließend plötzlich etwas anderes als None an "row" gebunden sein? Und viel wichtigere Frage: Was hättest du in "row" an der Stelle erwartet?
Danke für dein Feedback, zu deiner Frage:
Ich hatte mir davor die Einträge mit print in der Shell ausgeben lassen, da war dann das Ergebniss eine Auflistung der Einträge untereinander. Daher dachte ich, dass so dann die Daten auch in die Liste geschrieben werden. :roll:


Sirius3 hat geschrieben:@danohomie: die Fehlermeldung ist doch klar. Du beendest die while-Schleife erst, wenn `row` None ist, und None erlaubt eben keinen Indexzugriff. Es ist übrigens unschön, wenn man zusammengehörige Daten in getrennten Listen (nicht Arrays) speichern will. Nimm eine Liste, wo jeder Eintrag ein Tuple mit (name, adresse) ist:

Code: Alles auswählen

#Verbindung aufbauen
con = sqlite3.connect('test.db')

with con:
    cur = con.cursor()
    cur.execute("SELECT name, mac FROM Besucher")
    besucher_mit_adresse = cur.fetchall()
Eingerückt wird übrigens mit 4 Leerzeichen pro Ebene.
Danke für deine Hilfestellung, mit dem Tuple hast du Recht. Allerdings erfordert der nachfolgende Code, dass die beiden erstmal getrennt werden (wahrscheinlich kann man den Tuple auch getrennt betrachten, möchte den Code jetzt aber erstmal zum laufen bringen).

Dein Beispielcode funktioniert prima und liefert auch fast das gewünschte Ergebniss, es ist nur vor jedem Eintrag ein u' :K Hatte das davor schonmal, weiß aber nicht mehr was ich anders gemacht hatte damit ich nur den Datensatz ohne u' bekomme.


Vielen Dank für eure Hilfe :)
Dani
BlackJack

@danohomie: Das u ist in der Zeichenkettendarstellung des Tupels. Damit Du als Programmierer erkennst das es sich um Unicode-Zeichenketten handelt. Da musst Du nichts weg bekommen.
danohomie
User
Beiträge: 5
Registriert: Samstag 18. Februar 2017, 17:47

@BlackJack Danke für deine schnelle Antwort.

Das bedeutet ich kann es einfach ignorieren? Da ich die Liste nachher dursuchen will --> wird das u dann gar nicht beachtet?
BlackJack

@danohomie: Da ist genau so wenig ein u wie da Anführungszeichen in der Zeichenkette sind. (Es sei denn es sind wirklich Anführungszeichen in der Zeichenkette. :-))
danohomie
User
Beiträge: 5
Registriert: Samstag 18. Februar 2017, 17:47

BlackJack hat geschrieben:@danohomie: Da ist genau so wenig ein u wie da Anführungszeichen in der Zeichenkette sind. (Es sei denn es sind wirklich Anführungszeichen in der Zeichenkette. :-))
Okay jetzt hab ich es vielen Dank!

Hab meinen Unicode in Ascii umgewandelt und dann funktioniert jetzt auch alles :D

Vielen Dank für eure schnellen Antworten!
Dani
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@danohomie: das ist doch nicht Dein Ernst? Das ist keine Lösung. An welcher Stelle hattest Du denn ein Problem mit Unicode-Strings?
danohomie
User
Beiträge: 5
Registriert: Samstag 18. Februar 2017, 17:47

Sirius3 hat geschrieben:@danohomie: das ist doch nicht Dein Ernst? Das ist keine Lösung. An welcher Stelle hattest Du denn ein Problem mit Unicode-Strings?
Mein Ursprungsproblem, welches der Grund für meinen Post war, war nach deiner Hilfestellung dann gelöst. :D

Der Skript zu dem der anfängliche Code gehörte funktioniert aber trotzdem noch nicht :roll: mit der der Umwandlung funktionierte dieser dann aber :)
Antworten