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+MySQL: SELECT (výběr dat)
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='user',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='user',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='user',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='user',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='user',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='user',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='user',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ží!
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='user',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()
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='user',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()
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='user',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])
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='user',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()
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='user',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()
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='user',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()
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='user',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()
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("INSERT INTO `testTable` (data, datum) VALUES ('%s', '%s')" % (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