Kreuzvergleich Lottozahlen in SQLite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Hallo,

möchte Lottozahlen der vergangen Ziehungen mit den getippten Lottozahlen vergleichen.
An anderer Stelle gebe ich Anzahl der Übereinstimmungen aus.

Das Problem ist das die Zahlen an Unterschiedlichen Stellen stehen, so kann die getippte Zahl data[0][2] z.B. bei der Ziehung die Zusatzzahl sein.

Der untere Code funktioniert, aber es gibt viele Wiederholungen, kann das irgendwie verbessert werden?

https://github.com/MarkusHackspacher/py ... handler.py Zeile 160ff

Code: Alles auswählen

        c.execute("select rowid,* from ziehung \
where zahl_1 in (?,?,?,?,?,?) \
or zahl_2 in (?,?,?,?,?,?) \
or zahl_3 in (?,?,?,?,?,?) \
or zahl_4 in (?,?,?,?,?,?) \
or zahl_5 in (?,?,?,?,?,?) \
or zahl_6 in (?,?,?,?,?,?) \
or zahl_zusatz in (?,?,?,?,?,?) ORDER BY d",
         (
         data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], data[0][6],
         data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], data[0][6],
         data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], data[0][6],
         data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], data[0][6],
         data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], data[0][6],
         data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], data[0][6],
         data[0][1], data[0][2], data[0][3], data[0][4], data[0][5], data[0][6]
         ))
Screenshots zum Projekt:
http://markush.cwsurf.de/joomla_17/inde ... verwaltung
Zuletzt geändert von Anonymous am Montag 11. März 2013, 10:38, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Malta: An den Wiederholungen fällt als erstes auf, dass sie per Hand in den Quelltext geschrieben wurden, beziehungsweise die Kopieren und Einfügen Funktion des Editors ausgiebig genutzt wurde. Das kann man natürlich durch ein programmatisches erzeugen der SQL-Anweisung und der übergebenen Daten ersetzen. Den jeweils ersten Indexzugriff kann man vermeiden, in dem man nicht `fetchall()` bei einer Anfrage verwendet, die niemals mehr als einen Treffer haben kann.

Ich denke an der Stelle ist der Datenbankentwurf nicht so toll. Denn eigentlich haben die Zahlen einer Ziehung ja keine Reihenfolge, also sind diese Spalten ziemlich willkürlich. An den durchnummerierten Spaltennamen erkennt man auch schon, dass das eigentlich eine Liste sein sollte. Und da es das in SQL nicht als Spaltentyp gibt, müsste man das in zwei Tabellen aufteilen `ziehung` und `lottozahl` zum Beispiel.

Auch im Quelltext sind diese durchnummerierten Namen unschön. Statt `zahl_1`, `zahl_2`, und so weiter als Argumente, wäre eine Sequenz mit dem Namen `lottozahlen` besser, denn diese Zahlen gehören ja zusammen.

Deinen Tabellen fehlt ein Primärschlüssel. Die SQLite-interne RowID sollte man dafür nicht benutzen, denn das ist ein Implementierungsdetail von SQLite, welches ausserhalb von Deinem Datenbankentwurf liegt.

Ich vermisse in dem Datenmodell auch eine Beziehung zwischen Schein und Ziehung, denn jeder Schein gehört ja zu einer Ziehung für die er abgegeben wurde.

Es werden in dem Module zu viele ``\`` verwendet. Solange noch Klammern „offen” sind braucht man die nicht. Und bei den Zeichenketten würde ich den Umstand nutzen, dass Zeichenketten die nur durch „whitespace” (und Kommentare) getrennt sind, vom Compiler zu einer Zeichenkette zusammengesetzt werden. Beispiel:

Code: Alles auswählen

spam(
    'Blah... \
    more blah...'
)
# ist fast das gleiche wie:
spam(
    'Blah...'
    ' more blah...'
)
Im ersten Fall sind mehr Leerzeichen zwischen 'Blah...' und 'more'.

Bei den Cursor-Objekten könnte man mit ``with`` und `contextlib.closing()` arbeiten um den `close()`-Aufruf einfacher sicher hinzubekommen. Des weiteren fehlt den Methoden auch eine sicherere `commit()`/`rollback()` Behandlung.
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Habe die Anweisung jetzt programmatisch Erzeugt. Den Quelltext siehe Github, die \ habe ich auch überarbeitet.
https://github.com/MarkusHackspacher/py ... handler.py Z.160ff

Aber die Idee mit einer extra Tabelle nur für die Zahlen mit einem Verweis auf den entsprechenden Eintrag der Ziehung.

Das mit dem Primärschlüssel wusste ich nicht, aber wenn RowID nicht richtig ist muss ich das Programm entsprechend etwas überarbeiten.

Die Beziehung zwischen Schein und Ziehung möchte ich über das Datum sowie der Laufzeit des Lottoscheins herstellen.
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Ich habe nun den datenhandler umgeschrieben und auf Github ein neues Branch mit new_datastructure eröffnet.

Nur die Datei datahandler.py habe ich bis jetzt geändert und bevor ich nun weitermache, könnt ihr vielleicht kurz darüber schauen ob das so ok ist:
https://github.com/MarkusHackspacher/py ... handler.py
Antworten