Voit itse lisätä ja muuttaa sisältöä muokkaa-painikkeiden avulla
Ennen tallennusta suositellaan ottamaan kopio muokkausruudusta (ctrl-a -> ctrl-c)
Olet itse vastuussa tämän teoksen käytöstä aiheutuvista vahingoista Lue lisää.
Python ja MySQL
Yleistä
[muokkaa]Tämä sivu käsittelee Python ohjelmointikielen ja MySQL tietokannan välistä toimintaa.
Perustietoa MySQL-tietokannasta on enemmän sivulla MySQL. Siellä on esimerkiksi kerrottu SELECT komento.
Ohjeita
[muokkaa]MySQL asennus
[muokkaa]MySQL on tietokantapalvelin johon lisätään tietokantoja ja niihin lisätään tauluja jotka sisältävät sarakkeita rivejä eli tietueita. Esimerkiksi MediaWiki ja Drupal käyttävät tietokantaa.
Katso asennus sivulta MySQL.
MySQL - Python yhteyden asennus
[muokkaa]Connector/Python yhdistää MySQL tietokantaan Pythonin
Mavericks
[muokkaa]Connector/Python asennus
[muokkaa]- Connector toimii ilmeisesti vain Python 2 versioissa, esimerkiksi 2.7. Ei siis Puthon 3 -versioissa (31.12.2013)
- Lataa https://pypi.python.org/pypi/mysql-connector-python sivulta versio 1.1.4
- Asenna sivun http://dev.mysql.com/doc/connector-python/en/connector-python-installation-source-unix.html mukaan eli
cd mysql-connector-python-1.1.4 sudo python setup.py install ja anna kysyttäessä pääkäyttäjän salasana
dmg-paketti
[muokkaa]- Vaikuttaa että http://dev.mysql.com/downloads/connector/python/ sivulta ladattu dmg-paketti ei tällä hetkellä toimi. (31.12.2013)
Testaus onko asennus onnistunut
[muokkaa]Asennus selviää vasta kun import komennolla onnistutaan tuomaan moduuli.
python2.7 import mysql.connector Toimii jos ei tule virheilmoitusta eli esim. ImportError: No module named 'mysql' python tai python3 >>> from distutils.sysconfig import get_python_lib >>> print(get_python_lib()) Tulostaa: /Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages
Käyttö
[muokkaa]Normaalisti päätteen python -komento avaa päätteessä jonkun Python 2-version. Jos olet asentanut Python 3-version ja tehnyt ohjauksen siihen python -komennosta, niin saat Python 2-version käyttöön antamalla esimerkiksi komennon python2.7 Jos taas tarvitset idleä, anna päätteessä komento idle joka mahdollisesta ohjauksesta huolimatta avaa Python 2-version.
Linkkejä
[muokkaa]- http://dev.mysql.com/doc/refman/5.5/en/connector-python.html
- http://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html
MySQLdb - Ei toimi
[muokkaa]MySQLdb on toinen vaihtoehto Pythonin ja MySQL yhdistämiseen. Ilmeisesti se ei kuitenkaan enää toimi uusimpien Python ja MySQL versioiden kanssa. Ilmeisesti MySQL-python 1.2.4 eli MySQLdb toimii siis ainoastaan MySQL 5.5 asti. Selvitä myös ennen MySQL asennusta 32- vai 64-bittisen MySQL asennus liittyen tähän.
- 12/2013 tehdyssä asennuksessa Python 2.7, MySQL-python 1.2.4, MySQL 5.6 32- tai 64 bittisenä Mavericks:ssa ei toiminut heittämällä, mutta sen sijaan Connector/Python toimii edellisessä kokoonpanossa ainakin 64-bittisellä tietokannalla.
VAIHTOEHTO 1 Asennusvaihtoehto 1, asentaa MySQL:n Python 2.7:n käyttöön, mutta MySQL pitää olla enintään 5.5:
- Lataa viimeisin zip-tiedosto sivulta https://pypi.python.org/pypi/MySQL-python
- Pura ja siirry kansioon ja anna Päätteessä komento: sudo python setup.py clean
- Poista tiedosto hakemistosta /käyttäjänimi/.python-eggs Kyseessä on siis piilohakemisto jonka sisälllön näkee ls -a
- sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql
- muokkaa tiedostoa pico setup_posix.py muuttamalla rivi mysql_config.path = "mysql_config" riviksi mysql_config.path = "/usr/local/mysql/bin/mysql_config"
- sudo python setup.py build Äläkä huomioi virheilmoituksia
- sudo python setup.py install
- python2.7
- import MySQLdb
VAIHTOEHTO 2
- wget asennus
- Setuptools asennus katso sivulta Mac vinkit
- Päätteessä: sudo easy_install MySQL-python
- Päätteessä: python2.7
- Päätteessä: import MySQLdb
- Päätteessä käynnistää 2.7 idlen: idle
Yhteys tietokantapalvelimeen ja tietokantaan
[muokkaa]- Yhteys tietokantaan luodaan tuomalla mysql.connector ja funktiolla connect(). Suljetaan funktiolla close(). Käytetään cnx ja cursor muuttujia yhtäläisen käytännön mukaan.
- tarvittaessa voidaan lisätä host='127.0.0.1' tai host='localhost'
import mysql.connector cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana', database='tietokannan nimi') cnx.close()
Tietokannan luominen ja poistaminen
[muokkaa]Ks. MySQL#Tietokannan luominen ja poistaminen
Luominen Python ohjelmassa
[muokkaa]Seuraava ohjelma tarkistaa onko tietokanta jo olemassa ja tarvittaessa luo sen.
- Huomaa että seuraavassa tarkistuksen ja luonnin yhteydessä käytetään ja tehdään virheen tarkistuksia ja sitä varten tuodaan from mysql.connector import errorcode
- Anna luotavan tietokannan nimi muuttujalle tietokannannimitähän
#!/usr/bin/python
import mysql.connector
from mysql.connector import errorcode
cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana')
cursor = cnx.cursor()
def tietokannan_luonti(cursor, tietokanta):
try:
cursor.execute(
"CREATE DATABASE {} DEFAULT CHARACTER SET 'utf8'".format(tietokanta))
except mysql.connector.Error as err:
print("Uuden tietokannan luominen ei onnistunut: {}".format(err))
exit(1)
tietokanta = 'tietokannannimitähän'
try:
cnx.database = tietokanta
except mysql.connector.Error as err:
if err.errno == errorcode.ER_BAD_DB_ERROR:
tietokannan_luonti(cursor, tietokanta)
cnx.database = tietokanta
else:
print(err)
exit(1)
cursor.close()
cnx.close()
Taulun luonti
[muokkaa]Normaali taulu on tarkoitettu pitkäikäiseksi eli sitä ei turhaan kannata luoda ja poistaa. Lyhytaikaiset taulut ovat nk. "väliaikaisia" (temporary tables) tauluja.
- Luodaan taulu, jota käytetään tämän sivun esimerkeissä ja PHP ja MySQL sivun esimerkeissä. Katso miltä taulukko näyttää PHP ja MySQL -sivulta. Lisäksi kannattaa avata myös phpMyAdmin ohjelma, jota päivittämällä voi nähdä myös sen kautta esimerkkien muutokset tietokannassa.
- phpMyAdmin ohjelmassa SQL-välilehdellä tämä tehtäisiin seuraavasti:
CREATE TABLE taulunimi (numerokentta int(10) NOT NULL, tekstikentta varchar(50), liukuluku float, PRIMARY KEY(numerokentta));
- Seuraava ohjelma luo taulut, jotka listataan allekkain aloittaen aina TABLES['taulunimi'] = (... Ohjelma tarkistaa onko taulu luotu ennestään ja ilmoittaa siitä. Virhetilanteissa jatketaan seuraavan taulun lisäämisestä loppuun asti. Parempi on käyttää if not exists -tapaaa.
- Huomaa että tuodaan myös from __future__ import print_function
#!/usr/bin/python
from __future__ import print_function
import mysql.connector
from mysql.connector import errorcode
cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana', database='tietokannan nimi')
cursor = cnx.cursor()
TABLES = {}
TABLES['taulunimi'] = (
"CREATE TABLE `taulunimi` ("
" `numerokentta` int(10) NOT NULL,"
" `tekstikentta` varchar(50),"
" `liukuluku` float,"
" PRIMARY KEY (`numerokentta`)"
") ENGINE=InnoDB")
for muuttuja1, muuttuja2 in TABLES.iteritems():
try:
print("Luodaan taulua {}: ".format(muuttuja1), end='')
cursor.execute(muuttuja2)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
print("taulu on luotu jo aikaisemmin")
else:
print(err.msg)
else:
print("taulu on nyt luotu")
cursor.close()
cnx.close()
- Katso tauluesimerkkejä sivulta http://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html
Kysely tietokannasta
[muokkaa]Kysely muuttujan nimenä käytetään usein query.
#!/usr/bin/python
# Oheinen esimerkki hakee tietokannasta taulunimi:sestä taulusta kaikki rivit ja sarakkeet.
import mysql.connector
cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana', database='tietokannan nimi')
cursor = cnx.cursor()
cursor.execute("SELECT * FROM taulunimi")
for rivi in cursor:
print(rivi)
cursor.close()
cnx.close()
#!/usr/bin/python
# Oheinen esimerkki hakee tietokannasta taulunimi:sestä taulusta kaikki rivit ja sarakkeet.
import mysql.connector
cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana', database='tietokannan nimi')
cursor = cnx.cursor()
cursor.execute("SELECT * FROM taulunimi")
rivi = cursor.fetchone()
while rivi is not None:
print(rivi)
rivi = cursor.fetchone()
cursor.close()
cnx.close()
#!/usr/bin/python
# Oheinen esimerkki hakee tietokannasta taulunimi:sestä taulusta numero- ja tekstikenttä -sarakkeet joiden numeroarvot ovat 1 ja 99 välillä.
import mysql.connector
cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana', database='tietokannan nimi')
cursor = cnx.cursor()
kysely = ("SELECT numerokentta, tekstikentta FROM taulunimi "
"WHERE numerokentta BETWEEN %s AND %s")
alku = 1
loppu = 99
cursor.execute(kysely, (alku, loppu))
for (numerokentta, tekstikentta) in cursor:
print("{}, {}".format(numerokentta, tekstikentta))
cursor.close()
cnx.close()
Rivin lisääminen tauluun
[muokkaa]- Huomaa että jos esimerkiksi numerokentta on "tunnistekenttä", niin samalla numerolla ei voi tallentaa, jolloin saat virheilmoituksen.
#!/usr/bin/python
import mysql.connector
cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana', database='tietokannan nimi')
cursor = cnx.cursor()
tietue = ("INSERT INTO taulunimi "
"(sarake1, sarake2, sarake3) "
"VALUES (10, 'Teksti', 20)")
cursor.execute(tietue)
cnx.commit()
cursor.close()
cnx.close()
Arvoja voi lähettää muuttujina excecute() funktiossa
tietue = ("INSERT INTO taulunimi "
"(numerokentta, tekstikentta, liukuluku) "
"VALUES (%s, %s, %s)")
arvot = (11, 'Teksti', 20)
cursor.execute(tietue, arvot)
cnx.commit()
Arvon muuttaminen
[muokkaa]#!/usr/bin/python
import mysql.connector
cnx = mysql.connector.connect(user='käyttäjätunnus', password='salasana', database='tietokannan nimi')
cursor = cnx.cursor()
tietue = ("UPDATE taulunimi SET "
"liukuluku = 50 WHERE tekstikentta = 'Teksti'")
cursor.execute(tietue)
cnx.commit()
cursor.close()
cnx.close()
Virheilmoituksia
[muokkaa]- IntegrityError: 1062 (23000): Duplicate entry '11' for key 'PRIMARY'
- Ilmeisesti syntyy kun yritetään muuttaa ensisijaisen kentän arvoa joka on jo olemassa. Tämän sijaan REPLACE komento??
Lähteet
[muokkaa]http://dev.mysql.com/doc/refman/5.6/en/connector-python.html http://www.markomedia.com.au/installing-python-mysqldb-on-os-x/