SQLite (Python), random choice benutzen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

fetchall() liest alle Datensätze einer Anfrage auf einmal und stellt sie in einer Liste zur Verfügung. Jedes Listenelement ist wiederum ein Tupel. (Zur Erinnerung: Listen werden mit eckigen Klammern geschrieben, Tupel mit runden Klammern.)

Mit

gewinner.fetchall()[0]

holst du alle Datensätze auf einmal, um dann nur den ersten, nämlich den mit Index 0, zu verarbeiten. Dieser erste Datensatz ist natürlich ein Tupel, ausgedruckt sieht das etwa so aus:

(0.34543, )

Um alle Einträge der Liste nacheinander zu verarbeiten, solltest du folgendes ausprobieren:

gewinnerliste = cursor.execute("SELECT spieler_id FROM gewinnspiel_spieler")
   for ergebnistupel in gewinnerliste:
     wert = ergebnistupel[0]  # Wert aus Tupel entnehmen
     print(wert)

Oder auch das hier:

gewinnerliste = cursor.execute("SELECT spieler_id FROM gewinnspiel_spieler")
   for ergebnistupel in gewinnerliste:
     (wert, ) = ergebnistupel # Tupel in Einzelwerte aufdröseln
     print(wert)

Laut Dokumentation (https://docs.python.org/3/library/sqlite3.html) ginge auch:

   for ergebnistupel in cursor.execute("SELECT spieler_id FROM gewinnspiel_spieler"):
     wert = ergebnistupel[0]  #  Wert aus Tupel entnehmen
     print(wert)
Woher ich das weiß:Berufserfahrung – Berufstätigkeit als Software-Entwickler
PHLMinions 
Fragesteller
 04.09.2022, 16:03

Hey BorisG2011,
dein Kommentar hilft mir schon sehr weiter, danke dafür!

Beim anwenden von random.choice gibt er mir dann eine Fehlermeldung aus:

TypeError: object of type 'int' has no len()

Ich danke dir wie gesagt für deinen Kommentar!

Liebe Grüße,

PHLMinions

0
BorisG2011  04.09.2022, 16:14
@PHLMinions

Es geht offenbar darum, zunächst alle Spieler zu ermitteln und sodann mit der Funktion ramdom.choice einen Spieler zufällig auszuwählen. Dafür müssen wir beim Aufdröseln der aus der Datenbank empfangenen Datensätze eine Liste mit allen SpielerIDs aufbauen, die dann an random.choice übergeben werden kann.

Ich stelle mir das so vor:

listeSpielerIDs = []  #  leere Liste als Anfangswert
for ergebnistupel in cursor.execute("SELECT spieler_id FROM gewinnspiel_spieler"):
    wert = ergebnistupel[0]  #  Wert aus Tupel entnehmen
    listeSpielerIDs.append(wert)  # erhaltenen Wert an Liste
                                  # anhängen
#  Jetzt kann einer der in der Liste eingetragenen
#  Spieler zufällig ausgewählt werden:
erwaehlerSpieler = random.choice(listeSpielerIDs)
1
PHLMinions 
Fragesteller
 04.09.2022, 16:20
@BorisG2011

So simple? Uff Dankeschön für deinen Kommentar und deine Hilfe.
Liebe Grüße,
PHLMinions

1

Da [0] ja heißt, dass man das erste Element einer Listen nimm kannst du mal ohne [0] probieren.

also:

gewinner = cursor.execute("SELECT spieler_id FROM gewinnspiel_spieler")

random.choice(gewinner.fetchall())



Woher ich das weiß:eigene Erfahrung
PHLMinions 
Fragesteller
 04.09.2022, 15:49

Hey Hanibal,

das Problem hierbei ist dann das die Klammern und das Komma wieder da sind.. Deshalb habe ich es mit Range versucht, leider klappt dies auch nicht.

Weißt du zufällig wie ich die Klammern und das Komma entfernen kann? Mir fällt gerade ein, einen Filter zu machen, wäre das möglich umzusetzen?

Ohne [0] klappt es auch perfekt, nur die Klammern und das Komma ist das Problem..

Liebe Grüße,

PHLMinions

0
BorisG2011  04.09.2022, 16:00
@PHLMinions

Das Problem ist, dass ein aus der Datenbank empfangener Datensatz immer ein Tupel ist und das ein Tupel "aufgedröselt" werden muss. "Aufdröseln" heißt, dass aus dem Tupel die Einzelwerte zu entnehmen sind. In deinem speziellen Fall treten Tupel auf, die nur einen Wert enthalten, aberauch die müssen aufgedröselt werden. Für zusätzliche Irritation sorgt, dass Python für Tupel mit nur genau einem Element diese eigenwillige Schreibweise mit dem Komma verwendet.

Das Aufdröseln eines Tupel ist eigentlich ganz einfach: Wenn man weiß, wie viele Elemente ein Tupel enthält, verwendet man eine Zuweisung zwischen zwei Tupeln:

Links vom zuweisungszeichen schreibt man ein Tupel an, dessen Elemente sämtlich Variablennamen sind, rechts vom Zuweisungszeichen steht das aufzudröselnde Tupel.

Das Lesen aus einer Datenbank folgt immer dem folgenden fünfschrittigen Schema:

  1. Cursor herstellen. Der Cursor enthält die auszuführende SELECT-Anweisung
  2. Einen Datensatz holen. Der Datensatz wird als Tupel ausgeliefert.
  3. Das erhaltene Tupel aufdröseln.
  4. Die aus dem aufgedröselten Tupel erhaltnen Einzelwerte verarbeiten
  5. weiter bei Schritt 2.

Natürlich ist das kompliziert, aber die Situation wird noch komplizierter, wenn dieses Schema nicht eingehalten wird.

2