Installation in Thonny

  • Menupunkt Tools > Manage Packages...
  • Suche nach «PyMySql»
  • Install klicken

# Verbindung herstellen

Mit der Methode pymysql.connect() können wir eine Verbindung zu einem MySQL-Server herstellen. Dazu müssen wir Hostnamen des Servers, Name und Passwort des DB-Benutzers, Name der Datenbank, sowie den Zeichensatz und die Art des Ergebnisses kennen. Hierfür verwenden wir die Klasse pymysql.cursors.DictCursor. So erhalten wir die Ergebnis-Datensätze in Form eines Python-Dictionary, welchen wir in den Jinja-Templates weiterverwenden können.

import pymysql.cursors

def connect_db():
    connection = pymysql.connect(host='web3.gymkirchenfeld.ch',
                             user='thetvdb',
                             password='N08lzUvOjQpKu8Pp',
                             db='thetvdb',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)
    return connection
1
2
3
4
5
6
7
8
9
10

# Abfragen ausführen

Die von connect_db() zurückgegebene Verbindung kann dann in den unterschiedlichen Methoden verwendet werden:

from flask import Flask, request
import pymysql.cursors

app = Flask(__name__)

def connect_db():
    connection = pymysql.connect(host='web3.gymkirchenfeld.ch',
                             user='thetvdb',
                             password='N08lzUvOjQpKu8Pp',
                             db='thetvdb',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)
    return connection

@app.route("/test_search")
def test_search():
    suche = "lost"
    result = []
    try:
        connection = connect_db()
        with connection.cursor() as cursor:
            sql = "SELECT * FROM tvseries WHERE seriesname LIKE %s"
            cursor.execute(sql, ("%"+suche+"%",))
            result = cursor.fetchall()
    finally:
        connection.close()

    return str(result)

@app.route("/test_details")
def test_details():
    id = 73739
    try:
        connection = connect_db()
        with connection.cursor() as cursor:
            sql = "SELECT * FROM tvseries WHERE id=%s"
            cursor.execute(sql, (id,))
            serie = cursor.fetchone()
    finally:
        connection.close()

    return str(serie)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  • Die beiden Methoden test_search() und test_details() verwenden beide unsere eigene Funktion connect_db() um eine Verbindung zur Datenbank aufzubauen.
  • Da beim Zugriff auf die Datenbank etwas schieflaufen könnte, wird dieser Teil in einen try-Block gestellt.
  • Die SQL-Anfrage wird zuerst als String vorbereitet. Für die Benutzereingabe wird der Platzhalter %s verwendet.
  • Beim Aufruf der Funktion execute() wird neben dem SQL-String eine Liste von Elementen mitgegeben. Diese Elemente werden der Reihenfolge nacheinander in die SQL-Abfrage an die Stelle der Platzhalter %s eingesetzt. Dabei werden automatisch Massnahmen gegen Attacken per SQL-Injection vorgenommen.
    Weil unsere Liste nur aus einem Element besteht, müssen wir ein Komma hintenanstellen, damit Python merkt, dass es sich um eine Liste handelt.
  • Die Resultate liegen jetzt bereit. Sie können als Dictionary mit fetchone() oder als Liste von Dictionaries fetchall() abgeholt werden.
    Als Alternative zu fetchall() existiert cursor.fetchmany(20). Hiermit kann man die Anzahl der Ergebnisse auf 20 limitieren (natürlich kann man eine beliebige Zahl einsetzten.)
  • Im zum try-Block gehörenden finally-Block wird die Verbindung zur Datenbank geschlossen. Der finally-Block wird in jedem Fall ausgeführt, egal ob im try-Block alles geklappt hat oder nicht.
  • Schlussendlich können die Ergebnisse weiterverwendet werden. Im Beispiel werden sie einfach in Text umgewandelt und zurückgegeben.

Offizielle Dokumentation
https://pymysql.readthedocs.io/en/latest/ (opens new window)
Letzte Änderung: 26.6.2020, 20:40:54