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
Tulostettavaa versiota ei enää tueta ja siinä voi olla renderöintivirheitä. Päivitä selaimesi kirjanmerkit ja käytä selaimen tavallista tulostustoimintoa sen sijaan.

Yleistä

Tämä sivu käsittelee Python ohjelmointikielen ja MySQL tietokannan välistä toimintaa.

Perustietoa MySQL-tietokannasta on enemmän sivulla PHP ja MySQL. Siellä on esimerkiksi kerrottu SELECT komento.

Ohjeita

MySQL Connector/Python
MySQL 5.6 Reference Manual

MySQL asennus

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 PHP ja MySQL.

MySQL - Python yhteyden asennus

Connector/Python yhdistää MySQL tietokantaan Pythonin

Mavericks

Connector/Python asennus

cd mysql-connector-python-1.1.4 
sudo python setup.py install ja anna kysyttäessä pääkäyttäjän salasana

dmg-paketti

Testaus onko asennus onnistunut

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ö

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ä

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

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

  • 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

Tietokantoja voi olla useita tai yksi tietokanta voi sisältää monen eri ohjelman tauluja. Tällöin nämä taulut eritellään toisistaan etuliitteellä, esim. drupal13_ Samaa tietokantaa voidaan samanaikaisesti kutstua eri ohjelmista, jotka on tehty myös eri ohjelmointikielillä. MySQL-palvelimella voi olla useita tietokantoja ja näissä tietokannoissa useita tauluja. Tietokanta voidaan luoda esimerkiksi phpMyAdmin -ohjelmalla tai komentoriviltä päätteen avulla.

Katso myös mitä samasta aiheesta on sivulla PHP ja MySQL

Luominen cPanel ohjelmalla

  1. Databases > MySQL Database Wizard
  2. Create A Database > Anna tietokannalle nimi > Next Step
  3. Create Database Users > Anna käyttäjänimi ja erittäin vaikea salasana > Create User
  4. Add User to Database > Valitse All Priviledges > Next Step > valmis.
  • Kirjoita muistiin hostname (yleensä localhost), käyttäjänimi, tietokannannimini, salasana

Luominen pääteohjelman avulla

$ mysql -u root -p
syötä MySQL:n rootsalasana.
mysql> CREATE DATABASE tietokannannimi;
mysql> GRANT ALL PRIVILEGES ON tietokannannimi.* TO "käyttäjänimi"@"localhost";
mysql> FLUSH PRIVILEGES;
mysql> EXIT
  • Turvallisempaa olisi käyttää root -käyttäjän sijasta sitä käyttäjätunnusta, jota on käytetty mysql yhteydessä sitä asennettaessa.
  • ?Käyttäjänimi näkyy internetissä?

Luominen phpMyAdmin ohjelmalla

  • Koti (mökin kuva yläkulmassa) > Tietokannat -välilehti
    • Luo tietokanta: Anna nimi, Valitse Aakkosjärjestys ja paina Luo
      • utf8_general_ci sorts by stripping away all accents and sorting as if it were ASCII
      • utf8_unicode_ci uses the Unicode sort order, so it sorts correctly in more languages
  • Koti > Valitse tietokanta > Käyttöoikeudet > Lisää käyttäjä
    • Syötä käyttäjänimi, erittäin vaikea salasana, tarkista että "Anna tietokannalle "x" kaikki oikeudet on valittuna. > Siirry
  • Return to the Privileges screen and click the Check privileges icon on the user you've just created for database. In the Database-specific privileges section, select the database you've just created for your application under the Add privileges to the following database dropdown. The page will refresh with privileges for that database. Click Check All to select all privileges, and click Go.

TAI

  • Koti (mökin kuva yläkulmassa)
  • SQL -välilehti
  • CREATE DATABASE tietokannannimi; ja paina Siirry

Luominen Python ohjelmassa

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()

Poistaminen pääteohjelman avulla

$ mysql -u root -p
Anna kysyttäessä MySQL:n rootsalasana.
mysql> DROP DATABASE tietokannannimi;

Poistaminen phpMyAdmin ohjelmalla

  • Valitse vasemmalta poistettava tietokanta
  • Toiminnot -välilehti
  • Tuhoa tietokanta ja vahvista OK

TAI

  • Koti (mökin kuva yläkulmassa)
  • SQL -välilehti
  • DROP DATABASE tietokannannimi; ja paina Siirry (saattaa ilmoittaa että oikeudet eivät riitä, joten silloin edellinen vaihtoehto saattaa toimia)
    • oikeuksien asettaminen tähän....

Taulun luonti

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

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

  • 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

#!/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

  • 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

http://dev.mysql.com/doc/refman/5.6/en/connector-python.html http://www.markomedia.com.au/installing-python-mysqldb-on-os-x/