[Python3] MySQL verwenden

Um MySQL mit dem MySql Connector zu verwenden muss dieser zuerst in Python installiert werden:

sudo python -m pip install mysql-connector-python
oder sudo pip install mysql-connector-python
oder pip install mysql-connector-python
oder pip3 install mysql-connector-python

Für Windows halt ohne "sudo", ich empfehle: führen Sie CMD immer als Administrator aus, das geht mit WIN+R, dann cmd.exe eingeben und Shift+Strg+Enter drücken, dann startet man die CMD "elevated" also als Administrator. Dann bleibt man nirgendwo stecken, nur weil man keine Rechte hat...

Dann legen wir eine neue Datenbank am lokalen Computer/Server an:

DROP TABLE IF EXISTS `sample`;
CREATE TABLE IF NOT EXISTS `sample` (
  `id` int NOT NULL AUTO_INCREMENT,
  `record_no` int NOT NULL,
  `description` varchar(50) NOT NULL,
  `start_date` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `record_no_key` (`record_no`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
COMMIT;

Einfach mit PhpMyAdmin auf die lokale Datenbank verbinden und das .SQL Script ausführen, natürlich kann man noch das Script als .sql Datei speichern und dann per „Importieren“ dann ausführen, bei kleineren Dateien geht Copy/Paste bei größeren Importieren, wenn die Datei riesig ist, muss man direkt die Datei importieren (z.B. mit mysql -u username -p database_name < sample.sql)

Dann erstellen wir unser Pythonscript:

(Anmerkung: das Script NICHT mysql.py benennen, sonst überschreiben wir das Modul mysql mit unserem und das mysql Modul wird nicht gefunden!)

sudo nano mysql_test.py

Der Inhalt:

import mysql.connector
from datetime import date

cn_connect = mysql.connector.connect(
    host='localhost',
    user='root',
    password='admin',
    database='test_py'
)

# connect to mysql, cursor is our "recordset"
cursor = cn_connect.cursor()

# date of today
datum = date.today()

try:
    # select last record_no
    sql_query = "SELECT * FROM sample ORDER BY record_no DESC LIMIT 1 OFFSET 0"
    cursor.execute(sql_query)
    
    # fetch all records, even only one is in the buffer
    record = cursor.fetchone()
    
    # if we got a record, then get it
    if record:
        # read last_record_no
        last_record_no=record[1]
    else:
        # otherwise last_record_no=0
        last_record_no=0    
except mysql.connector.Error as error:
    print("Error while connecting to MySQL", error)

# prepare sql query for insert
sql_insert = "INSERT INTO sample (record_no, description, start_date) VALUES (%s, %s, %s)"
data = (last_record_no+1, "*Automatic insert*", datum)

# add record to database
cursor.execute(sql_insert, data)

# finish transaction = important!
cn_connect.commit()

# close cursor
cursor.close()

# close connection
cn_connect.close()

Ausführen:

sudo python mysql_test.py

Unser Script liest den letzten Datensatz in der Tabelle „sample“, liest den letzten „record_no“ aus, später wird dieser wieder mit +1 eingefügt. Wenn kein Datensatz ursprünglich in der Tabelle war (wir testen mit if record:) dann wird die variable last_record_no mit 0 initialisiert. 0+1 ergibt dann den Start record_no als 1. Bitte nicht record_no als ID verwenden, das überlassen wir hübsch MySQL mit der Auto-ID, das funktioniert und hat mit der record_no nichts zu tun, die verwenden wir später für Relationen, Links usw. um z.B. 2 Datenbanken verbinden zu können oder sauber zu Synchronisieren, wir verlassen uns nicht auf die MySQL-ID.

Getestet unter CentOs 7, Debian 11 und diesmal auch Windows 10 (wird mit Windows 11 genau so funktionieren)

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Happy coding!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.