!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

Database
MySql
Børre Stenseth
Python >Databaser

Python og MySQL

Hva
Kort om installering og bruk av MySQL fra Python

Vi kan bruke MySQL på to måter fra Python:

  • Vi kan installere MySQL-biblioteket og programmere mot dette på "vanlig måte", med forespørsler (requests) og oppdateringer og hva vi måtte finne på.
  • Dersom vi bare er interesserte i å lese data kan vi gjøre dette uten MySQL-biblioteket. Vi kan sende kommandoer til MySQL installasjonen og får svar, blandt annet i form av XML. Dette er nærmere beskrevet i modulen Databasedump

MySQL

  • Last fra MySQL [1] , og installer denne der du ønsker.
  • Last evt. også ned "MySQL Workbench" fra samme sted. Her finner du verktøy for å administrere og inspisere databaser.
  • Databasen må startes

Python bibliotek for MySQL

Kjøring av SQL-statements i Python - prinsipp:

ssh
Python MySQL

Når vi programmerer bruker vi MySQLdb-objekter for å koble oss opp, hente data osv. Dette blir dermed integrert i Python.

Opplegget blir i korthet:

  • Koble opp databasen (lag et databaseoppkoblingsobjekt som peker til den maskinen og databasen du ønsker å jobbe med)
  • Deklarer et resultatobjekt som kan eksekvere spørringer og hvor resultatet av spørringen mot databasen kan legges
  • Bruk databasen
    • Legg spørringen i en tekststreng
    • Kjør spørringen
    • Bruk resultatet
  • Koble ned databasen

Eksempel1

Python 2.0 (#8, Oct 16 2000, 17:27:58) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
IDLE 0.6 -- press F1 for help
def MySQLdemo():
    # importer bibliotek, koble opp databasen
    # og sett opp en markør (resultatobjekt)
    # host, bruker, passord, database
    # som host kan du skrive ip, db er databasenavnet i MySQL
    import MySQLdb
    #forutsetter først at basen ligger lokalt, uten passord
    mindatabase=MySQLdb.connect(host='localhost',user='',passwd='',db='test')
    mintabell=mindatabase.cursor()
    # Legger inn en ny kunde. Gir ingen melding tilbake hvis alt er ok
    sql_setning="insert into kunde values (46,'Hansen & Co')"
    mintabell.execute(sql_setning)
    #definer og eksekver en sporring.
    # NB: Hele SQL (også tabelloppretting) kan brukes.
    sql_setning = 'select * from kunde'
    mintabell.execute(sql_setning)
    # Lister ut de aktuelle, alt. 1, med feltnavn
    for kundenr,kundenavn in mintabell.fetchall():
    print 'Kunde --: ',kundenr,kundenavn
    print "ferdig1"
    # Lister ut de aktuelle, alt. 2, med feltnr
    for radene in mintabell.fetchall():
      print 'Kunde --: ',radene[0],radene[1]
    print "ferdig2"
    mindatabase.close()
  # eksempel som viser oppkobling mot ekstern database:
  # mindatabase =MySQLdb.connect
  # (host='pc16-81.hiof.no',user='iad10002',passwd='javaxerxgoy', db='skatt')
  

Resultatet av de to utlistings avsnittene ovenfor:

>>> MySQLdemo()
Kunde -->  1 Ole
Kunde -->  2 Hans
Kunde -->  46 Hansen & Co
ferdig1
Kunde -->  1 Ole
Kunde -->  2 Hans
Kunde -->  46 Hansen & Co
ferdig2
>>>

Eksempel 2

Vi skriver en liten modul som henter og lister data om viner.

import MySQLdb
"""
    Use MySQL
    Read a database and build a HTML-file
    Database table:
    create table wines(
        vin_id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(100),
        catalog CHAR(10),
        type CHAR(10),
        country VARCHAR(20),
        dice TINYINT,
        volume INT,
        price CHAR(10),
        description TEXT
    );
"""
#----------------------------------
# connect and execute a sql-request
def connectAndExecute(sql):
    myBase=None
    try:
        myBase=MySQLdb.connect(host='frigg.hiof.no',
                               user='student',
                               passwd='student',
                               db='vin')
        myTab=myBase.cursor()
        myTab.execute(sql)
        myBase.commit()
        myBase.close()
        return myTab.fetchall()
    except MySQLdb.Error, e:
        print "Error %d: %s" % (e.args[0], e.args[1])
        if myBase!=None:
            myBase.close()
        return None
if __name__=="__main__":       
    SQL_SELECT_WINES="""SELECT name,dice FROM wines 
    WHERE country='%s' AND type='%s';"""
    
    results=connectAndExecute(SQL_SELECT_WINES%('Portugal','white'))
    if results!=None:
        print str(len(results))+' hvite viner fra Portugal'
        print '------------------------'
        for ix in range(0,len(results)):
            record=results[ix]
            print str(record[1])+' : '+record[0]
Referanser
  1. MySQL mysql.com www.mysql.com 14-03-2010
  1. MySQL, kort om SQLzoo.net sqlzoo.net/ 14-03-2010
  1. MySQL for Python sourceforge.net sourceforge.net/projects/mysql-python 14-03-2010
  1. Unofficial Windows Binaries for Python Extension Packages www.lfd.uci.edu/~gohlke/pythonlibs/ 03-08-2011

Noen eksempler på bruk av databaser i dette materialet:

Vedlikehold
Revidert juli 2013, Børre Stenseth
( Velkommen ) Python >Databaser ( Databasedump )