Python 2.díl: Práce s databází MySQL (SELECT, UPDATE, INSERT)

02.06.2017 napsal Hanz (update: 16.09.2019)
34

Python 2.díl: Práce s databází MySQL (SELECT, UPDATE, INSERT)


Ve druhém díle seriálu věnovanému programovacímu jazyku Python se podíváme na spolupráci pythonu s databází MySQL (MadiaDB). V příkladech si ukážeme SELECT, INSERT a UPDATE, dále použití proměnných, cykly FOR a WHILE, metody fetchone() a fetchall().

Pro připojení k databázovému serveru MySQL je potřeba stáhnout komponentu (knihovnu, rozšíření) PyMySQL a nainstalovat ji pomocí příkazu python setup.py install či přes pip pip3.4 install pymysql. Pak již nic nebrání provedení následujících příkladů.

Python+MySQL: SELECT (výběr dat)


Výběr s fetchone()


Python kód provádí SELECT všech sloupců z MySQL tabulky „tabulka“ pomocí cyklu WHILE a metody fetchone(), dokud platí "row is not None" ("dokud řádek není None = prostě už další řádek nenásleduje").


import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='heslo',db='databaze')
cur = con.cursor()
cur.execute("SELECT * FROM `tabulka`")
row = cur.fetchone()
while row is not None:
print(row[0], row[1], row[2])
row = cur.fetchone()
cur.close()
con.close()


Výběr s fetchall()


Python kód provádí SELECT všech sloupců z MySQL tabulky „tabulka“ pomocí cyklu FOR a metody fetchall().


import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='heslo',db='databaze')
cur = con.cursor()
cur.execute("SELECT * FROM `tabulka`")
rows = cur.fetchall()
for row in rows:
print(row)
cur.close()
con.close()


Výběr s fetchone() + proměnné (cyklus WHILE)


Python kód provádí SELECT sloupců "sloupec1", "sloupec2" z MySQL tabulky „tabulka“ pomocí cyklu WHILE, dokud neplatí "row == None". Hodnoty jsou ukládány do proměnných "promenna1" a "promenna2".


import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='heslo',db='databaze')
with con:
cur = con.cursor()
cur.execute("SELECT sloupec1, sloupec2 FROM `tabulka` WHERE status='0'")
while True:
row = cur.fetchone()
if row == None:
cur.close()
con.close()
promenna1 = str(row[0])
promenna2 = str(row[1])


Výběr s fetchone() + proměnné (cyklus FOR)


Python kód provádí SELECT sloupců "sloupec1", "sloupec2" z MySQL tabulky „tabulka“ pomocí cyklu FOR, dokud nejsou vypsány všechny řádky - jejich počet je zjištěn pomocí funkce rowcount. Hodnoty jsou ukládány do proměnných "promenna1" a "promenna2".


import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='heslo',db='databaze')
with con:
cur = con.cursor()
cur.execute("SELECT sloupec1, sloupec2 FROM `tabulka`")
for i in range(cur.rowcount):
row = cur.fetchone()
promenna1 = row[0]
promenna2 = row[1]
cur.close()
con.close()



Python+MySQL: INSERT (vložení dat)


Python kód provádí vložení proměnných "promenna1", "promenna 2" a "promenna3" do sloupců "sloupec1", "sloupec2" a "sloupec3" v MySQL tabulce "tabulka".

Vložení dat



import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='heslo',db='databaze')
cur = con.cursor()
promenna1 = "hodnota1"
promenna2 = "hodnota2"
promenna3 = "hodnota3"
with con:
cur.execute("INSERT INTO `tabulka`(`sloupec1`, `sloupec2`, `sloupec3`) VALUES ('%s', '%s', '%s')" % (promenna1, promennna2, promenna3))
print("Počet upravených řádek:", cur.rowcount)
cur.close()
con.close()


Python+MySQL: UPDATE (úprava dat)


Python kód provádí update sloupce "status" na hodnotu "0" pro záznam s id "25" v MySQL tabulce "tabulka".

Update dat



import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='heslo',db='databaze')
cur = con.cursor()
with con:
cur.execute("UPDATE tabulka SET status='0' WHERE id = '25'")
print("Počet upravených řádek: ", cur.rowcount)
cur.close()
con.close()


Update dat s proměnnými


Python kód provádí update sloupců "sloupec1", "sloupec2" a "sloupec3" na hodnoty proměnných "promenna1", "promenna2" a "promenna3" pro záznam id = "promenna4" v MySQL tabulce "tabulka".

import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='heslo',db='databaze')
cur = con.cursor()
promenna1 = "hodnota1"
promenna2 = "hodnota2"
promenna3 = "hodnota3"
promenna4 = "hodnota4"
with con:
cur.execute("UPDATE tabulka SET sloupec1='%s', sloupec2='%s', sloupec3='%s' WHERE id='%s' " % (promenna1, promenna2, promenna3, promenna4))
print("Počet upravených řádek: ", cur.rowcount)
cur.close()
con.close()


Dodatek pro InnoDB


Pokud používáme v MySQL typ (engine) InnoDB, tak je třeba vždy volat navíc
con.commit(). Skript žádnou chybu nebude vyhazovat, ale data se do tabulky neuloží!
Vaše reakce na článek Python 2.díl: Práce s databází MySQL (SELECT, UPDATE, INSERT)

Napsat komentář k článku

Před 2 lety napsal komentář Switchbla… [1]
Ahoj,

mám docela zajímavý problém když provádím insert pomocí této konstrukce v Pythonu:


<blockquote><pre><code data-language="python">
for row in notes:
data = row[0]
datum = row[1]
query = str(&quot;INSERT INTO `testTable` (data, datum) VALUES ('%s', '%s')&quot; % (data, datum))
print(query)
cur.execute(query)

cur.close()
</code></pre></blockquote>



Stane se to, že data se do MySQL tabulky nepřenesou, avšak když provedu SQL dotaz z proměnné "query" přímo na databázovém serveru, tak se tam daný záznam v pořádku uloží, avšak dostane id např. 150 a pak pustím znovu skript, nic se neuloží a zadám zase ručně jeden SQL dotaz a id dostane např. 250, ačkoliv předešlé id je vidět 150! To je fakt divný. Nějaká rada prosím?

A jinak díky za super článek pro začátečníky
Poslední komentář
Před 2 lety napsal komentář Rusty [2]
Ahoj, použij commit() a uvidíš, určitě to pak projde:

<blockquote><pre><code data-language="python">
for row in notes:
data = row[0]
datum = row[1]
query = str(&quot;INSERT INTO `testTable` (data, datum) VALUES ('%s', '%s')&quot; % (data, datum))
print(query)
cur.execute(query)
con.autocommit(True)

cur.close()
</code></pre></blockquote>
Tento web používá k poskytování služeb, personalizaci reklam a analýze návštěvnosti soubory cookie. Používáním tohoto webu s tím souhlasíte. Další informace