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
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
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()
undtest_details()
verwenden beide unsere eigene Funktionconnect_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 Dictionariesfetchall()
abgeholt werden.
Als Alternative zufetchall()
existiertcursor.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örendenfinally
-Block wird die Verbindung zur Datenbank geschlossen. Derfinally
-Block wird in jedem Fall ausgeführt, egal ob imtry
-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)
← Flask Jinja-Templates →