[[: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)