Datenbank Python

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Community,

    ich habe eine Datenbank erstellt und wollte wissen, wie man über Python darauf zugreifen kann. In der Datenbank sind Datensätze mit dem Namen und der persönlichen Kennziffer. Nun möchten ich ein Login Script schreiben, der die Kennziffern der Datenbank abruft und sie vergleicht, falls die angegebene Ziffer mit einer der Datensätze übereinstimmt, soll der Login erfolgen.

    Meine Frage lautet nun, ob es für so etwas ein Tutorial gibt.
    MFG
    lilky

    PS: Die Datenbanksprache sollte SQLite oder MySQL sein.

  • Wenn du bereits eine Datenbank erstellt hast, müsstest du eigentlich wissen ob es SQLite oder MySQL ist :fies:
    Zwar sind die Query's ähnlich, aber nicht vollständig kompatibel


    Eine Forumsuche nach "python sqlite" oder "python mysql" kann dir aber auch deine Frage beantworten..

  • Hier mal ein abgewandelter Code der in ähnlicher Form gut funktioniert.

  • svblue: Da stört mich das global setzen von 'db', sowas sollte man möglichst vermeiden ;)
    Da kann man besser 'db' auch gleich beim 'return' mit zurück geben. Und sowas wie die Zugangsdaten würde ich lieber ausserhalb einer Funktion am Anfang des Scripts setzen, damit man nicht irgendwo im Code Änderungen vornehmen muss. Und beim 'except:' wärs ggf auch nicht schlecht den Grund wieso es nicht funktionierte auszugeben, dafür ist das eigentlich auch gedacht ;)

    Und unkommentiert nur 2 Funktionen zu posten ist imho auch nicht so toll, da ein Anfänger beim DBselect nur schwierig nachvollziehen kann was ERG bedeutet oder wieso es dort returned werden soll, oder generell was dort gemacht wird. Inwiefern diese Funktion letztlich zum Einsatz kommt kann selbst ich nur schwer raus lesen. Der Funktionsname entspricht aber auch nicht dem was dort gemacht wird, da der 'select' nicht flexibel ist, also ein besserer Name der Funktion wäre sowas wie 'checkLogin' oder so.
    Auch nach jedem Select die Verbindung zu schließen erachte ich nicht als so performant...
    Und lieber mit "if .. elif.." wenn möglich arbeiten, denn wieso sollte DBonline noch mals auf 0 geprüft werden wenns vorher denn schon auf 1 zutraf. Das fällt zwar bei kleineren Projekten nicht allzusehr ins Gewicht, aber bei größeren Projekten kann sich sowas zu ner nicht zu verachtenden unnötigen Verzögerung summieren :(

    Inwiefern es überhaupt Sinn macht für alles eine extra Funktion anzulegen hängt natürlich vom Umfang des Projekts ab, solange es nur um das geht was der TE machen möchte sehe ich eigentlich kein Bedarf das in extra Funktionen auszulagern.

    Aber es fehlen für uns auch genauere Informationen um was für ein Loginsystem es sich überhaupt handelt oder wie die zu prüfende Kennziffer ans Python Script übergeben werden soll etc.
    Ich werf dann also mal das in den Raum:

  • 1.
    Da finde ich den Code von svblue besser (obwohl sich dieser auch nicht an die Namenskonvention hält), weil dieser nicht völlig auf Modulebene basiert. Die Aussage, dass bei wenig Code es keinen Sinn macht, Funktionen zu schreiben, ist völlig falsch. In einer Shell zum testen ist es i.O. auf Modulebene zu schreiben, in einem Programm sollte außer den Imports, Konstanten, Klassen- und Funktionsdefinitionen nichts anderes stehen.

    2.
    Die try-excepts sind IHMO auch sinnlos, da Ausnahmen (exceptions) vom Interpreter sowieso zurückgegeben bzw. ausgegeben werden. Der Sinn von Behandlung von Ausnahmen ist, Ausnahme-Fehler abzufangen und dafür zu sorgen, dass das Programm weiter läuft. Das ganze mit dem ``with`` Statement würde sich auf vier Zeilen begrenzen.

    Die Übergabe von Kommandozeilenargumenten wurde vom TE auch nicht gefragt und verwirrt diesen sicherlich mehr, als die zwei Funktionen von svblue.

    Auch ist http://www.mikusa.com/python-mysql-docs/index.html sicherlich nicht die beste Quelle.

  • Hallo,

    svblue: Die Aufteilung auf 2 Funktionen in dieser Art und Weise macht keinen Sinn. Du brauchst keine Funkttion zum Öffen der DB-Connection, wenn die in der anderen Funktion Abfrage _und_ Schließen der Connection realisiert. Entweder drei Funktionen (Öffnen, Abfrage, Schließen) oder eine mit allem drin. Im vorliegenden Fall ist letzteres IMHO sinnvoller.

    Wenn du `return 1`schreibst, dann kannst du das auch weglassen, weil ohne `return` immer `return True` kommt. `return 1`oder `return 0` sind unter Python eher unüblich, wenn dann `return True` oder `return False` (auch, wenn das Ergebnis das gleiche ist).

    `if (DBonline == 1):` ist auch unpythonisch. Kürzer, eleganter, pythonischer: `if DBonline:`

    Dto. `if (str(temp) == "None"):`. Besser: `if not temp:`

    Und `str(temp)` ist auch quatsch. `temp` ist grundsätzlich eine Liste oder Tuple. Das ist in 99,99% aller Fälle sinnfrei, das _komplett_ in einen String zu wandeln.

    Und noch: `ERG = (str(temp[0])` - warum wieder str? Selbst wenn dann ein Vergleich folgen würde - mann _weiß_ doch, welchen Datentyp man aus der DB erwartet und vergleicht entsprechend dagegen. Da braucht's keine Typkonvertierung.

    Ansonsten hat der Code für Python zu viele überflüssige Klammern. Und, wie bootsmann schon sagt, bzgl. der Nameskonventionen unter Python am besten mal die PEP8 lesen.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!