[[:oktatas:programozás:python:adatbázis|< Adatbázis]] ====== Python MariaDB ====== * **Szerző:** Sallai András * Copyright (c) 2020, Sallai András * Szerkesztve: 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== A MariaDB egy SQL alapú adatbáziskezelő rendszer, a MySQL-ből ágaztatva, azzal teljesen kompatibilis. A MariaDB TCP hálózati foglalaton keresztül érhető el, azonosítás után. {{:oktatas:programozas:python:adatbazis:mariadb.png|}} ===== A MariaDB elérése Python nyelven ===== A MariaDB elérése megvalósítható mysql csomagokkal is, de itt most kifejezetten MariaDB számára készített csomaggal imserkedünk. Amire szükség van: * Telepített Python 3 (minimum 3.6) * MariaDB 10.x * Telepített MariaDB Connector/C (legalább egy 3.1.5 vagy újabb) ===== Telepítés ===== A szükséges csomagok telepítése Debian GNU/Linux 10-en: Telepítsük fel a MariaDB Connector/C-t: apt install libmariadb-dev A Python modul telepítése: pip install mariadb Linuxon és MacOS: pip3 install mariadb Ha szükséges: python3 -m pip install --upgrade pip Tesztelés: python >>> import mariadb >>> >>> ==== macOS ==== brew install mariadb-connector-c pip3 install mysqlclient ===== Lekérdezés ===== import mariadb config = { 'host': 'localhost', 'user': 'feherbt', 'password': 'titok', } conn = mariadb.connect(**config, database='feherbt') cur = conn.cursor() sql = """ select * from employees """ cur.execute(sql) print(cur.fetchall()) conn.close() A talált sorok száma: cur.execute(sql) datas = cur.fetchall() if cur.rownumber > 0: print(cur.rownumber) else: print('Nincs találat') ===== Lekérdezés mezőnként ===== import mariadb config = { 'host': 'localhost', 'user': 'feherbt', 'password': 'titok', } conn = mariadb.connect(**config, database='feherbt') cur = conn.cursor() sql = """ select * from employees """ cur.execute(sql) for (id, name, city, salary) in cur: print(f"{id}:{name}:{city}:{salary}") conn.close() ===== Beszúrás ===== import mariadb config = { 'host': 'localhost', 'user': 'feherbt', 'password': 'titok', } conn = mariadb.connect(**config, database='feherbt') cur = conn.cursor() sql = """ insert into employees (name, city, salary) values ('Verem László', 'Szeged', 3850000) """ cur.execute(sql) print('Utoljára beszúrt: ', cur.lastrowid) print('Érintett rekordok száma: ', cur.rowcount) conn.commit() conn.close() ===== Behelyettesített beszúrás ===== sql = """ insert into employees (name, city, salary) values ('%s', '%s', %.0f) """ % (employee.name, employee.city, employee.salary) cur.execute(sql) ===== Előkészített beszúrás ===== Van különbség a MySQL és a MariaDB megvalósítás között. MySQL-ben a helyettesítendő részt %s-el jelöljük, míg MariaDB esetén ez kérdőjel: ? import mariadb config = { 'host': 'localhost', 'user': 'feherbt', 'password': 'titok', } conn = mariadb.connect(**config, database='feherbt') cur = conn.cursor() sql = """ insert into employees (name, city, salary) values (?, ?, ?) """ values = ('Árbi Szabolcs', 'Miskolc', 2240000) cur.execute(sql, values) conn.commit() conn.close() ===== Több elem beszúrása ===== import mariadb config = { 'host': 'localhost', 'user': 'feherbt', 'password': 'titok', } conn = mariadb.connect(**config, database='feherbt') cur = conn.cursor() sql = """ insert into employees (name, city, salary) values (?, ?, ?) """ values = [ ('Csevegő Emese', 'Miskolc', 2250000), ('Rakica Katalin', 'Szolnok', 3250000), ('Libi Melinda', 'Miskolc', 4950000), ] cur.executemany(sql, values) print('Utoljára beszúrt: ', cur.lastrowid) print('Érintett rekordok száma: ', cur.rowcount) conn.commit() conn.close() ===== Kivételkezelés ===== import mariadb config = { 'host': 'localhost', 'user': 'penztar', 'password': 'titok', } try: conn = mariadb.connect(**config, database='penztar') except mariadb.Error as err: print(err, file=sys.stderr) sys.exit(1) cur = conn.cursor() cur.execute("show tables") print(cur.fetchall()) conn.close() ===== Tranzakció ===== A tranzakció a cur = conn.cursor() sorral indul és a conn.commit() sorral ér véget. import mariadb config = { 'host': 'localhost', 'user': 'feherbt', 'password': 'titok', } conn = mariadb.connect(**config, database='feherbt') cur = conn.cursor() sql = """ insert into employees (name, city, salary) values (?, ?, ?) """ values = ('Csirke Borbála', 'Miskolc', 5250000) cur.execute(sql, values) lastrowid = cur.lastrowid print('Utoljára beszúrt: ', cur.lastrowid) print('Érintett rekordok száma: ', cur.rowcount) sql = """ update employees set name='Tengeri Béla' where id = {lastrowid} """ conn.commit() conn.close() ===== Tranzakció kivételkezeléssel ===== import mariadb config = { 'host': 'localhost', 'user': 'feherbt', 'password': 'titok', } try : conn = mariadb.connect(**config, database='feherbt') cur = conn.cursor() sql = """ insert into employees (name, city, salary) values (?, ?, ?) """ values = ('Csirke Borbála', 'Miskolc', 5250000) cur.execute(sql, values) lastrowid = cur.lastrowid print('Utoljára beszúrt: ', cur.lastrowid) print('Érintett rekordok száma: ', cur.rowcount) sql = """ update employees set name='Tengeri Béla' where id = {lastrowid} """ conn.commit() conn.close() except Exception as ex: print(f'Hiba a commit során: {ex}') conn.rollback() ===== Adatbázis létrehozása ===== conn = mariadb.connect(host='localhost', user='username', password='titok') cur = conn.cursor() cur.execute("create database valami") cur.execute("showtables") databases = cur.fetchall() for database in databases: print(database) conn.close() ===== Módosítás ===== conn = connectDb() cur = conn.cursor() sql = """ update vehicles set sold=1 where id = (?) """ values = (vehicle_id,) cur.execute(sql, values) conn.commit() conn.close() ===== Forrás ===== * https://mariadb.com/resources/blog/mariadb-connector-python-beta-now-available/ (2020) * https://mariadb.com/resources/blog/how-to-connect-python-programs-to-mariadb/ (2020) * https://mariadb.com/docs/appdev/connector-python/ (2020)