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/