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

Wikikko - kansan taitopankkista
Siirry navigaatioon Siirry hakuun

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 Connector/Python
MySQL 5.6 Reference Manual

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]

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]

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

  1. wget asennus
  2. Setuptools asennus katso sivulta Mac vinkit
  3. Päätteessä: sudo easy_install MySQL-python
  4. Päätteessä: python2.7
  5. Päätteessä: import MySQLdb
  6. 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()

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/