Tag: SQLite

  • SQL: Setup a Learning Workbench with SQLite and SQuirreL

    SQL: Setup a Learning Workbench with SQLite and SQuirreL

    Install SQLite

    To download SQLite you only need to download a file from the project homepage of SQLite. Select download, and precompiled download for your prefered operating system.

    Unzip the folder with the binary, and place it in a folder that is accessible from your command line interface (The terminal on Mac/*nix systems and Powershell or cmd on Windows). This is a folder that is in the path variable. Here is how you can add a folder to the path on several operating systems.

    Open the terminal, and type sqlite3.exe.

    Once you have installed SQLite in a folder accessible from the path, you should get this prompt when starting the program.

    Download sample dataset

    The next step is to download the data we are going to use. Luckily for us, there are many sample databases available online. One of these is the Chinook database. Download the dataset from here. Unzip the database, and find the ‘Chinook_Sqlite.sqlite’ file. Move this to a folder, and start sqlite3.exe with the path to the database as argument. j

    Validate the downloaded database by displaying the tables it contain (and then, if you want, run a query to see some content – just for fun.)

    Download SQuirrel SQL, a SQL query tool

    You have done great! We now have a functional database with both SQLite and some data we can use. We could stop now, and do what we want with SQLite, but for us to work better it would have been great having a tool beside the CLI to interact with the database.

    SQuirreL is just such a tool. An Open Source SQL-workbench with support for several database-systems including MySQL, Oracle, DB2 and SQLite. In this GUI tool you can navigate the database, run queries, display graphs of how tables are related and more.

    Find the installation files here. Select the build approprate for your operating system, run the file downloaded and run through the installation.

    Connect SQuirreL with your database

    Eu Wern Te has written a short guide to how you can install a JDBC-driver for SQLite, and connect SQuirreL to the sqlite-database. To summarize, you will need to download the JDBC-driver, add this to SQuirreLs lib-folder. When this is done: open SQuirreL, add the driver and then make an alias where you in the URL-field insert the path to the SQLite-database. You will need to fill out several fields, so check out the guide.

    Once you have connected SQuirreL with the datasbase, you can connect and communicate with the database through this tool.

     

  • Åpne stortingsdata

    For en stund tilbake skrev jeg en liten post om hvordan stortingsdata kunne hentes ned fra Stortingets hjemmesider programmatisk. Som et utgangspunkt for å benytte data, enten til lek eller alvor, mener jeg offentlige data fungerer utmerket. Vi lever jo i et demokratisk samfunn, og uansett hvor mye mye tillit du måtte ha til politikerne eller mediene (eller hvor lite) har du som borger en rett til å gjøre dine egne analyser av offentlig informasjon og forhåpentligvis finner du noe interessant som kan hjelpe deg i å gjøre opp en mening om en konkret sak, eller hvem du skal stemme på ved neste valg. Det er også en fordel at offentlighetsloven legger til rette for at du skal kunne gjøre det du vil uten at du først trenger å spørre om lov.

    Sist vi benyttet oss av stortingsdata måtte vi benytte en del teknikker for å få tak i de dataene vi ønsket. Vi parset HTML-sider og brukte regulære utrykk for å “reverse engineere” sidene til Stortinget for å hente ut representantenes IDer, navn, fødselsdato og kjønn. Siden den gang har Stortinget valgt å legge ut sine data til offentligheten i et maskinlesbart format slik at det skal bli enklere å undersøke disse. Dette initativet går inn i ny, men stadig økende tradisjon for åpne data (eller Open Public Data, som jeg valgte å kalle dem i min masteroppgave).

    data.stortinget.no kan du finne data om saker, sesjoner, representanter, temaer, komiteer og annet som er relevant for den daglige driften av landets lovgivende forsamling. Denne informasjonen har hele tiden vært tilgjengelig for offentligheten, men nå er den også tilgjengelig i et maskinlesbart format. På den nye siden finner du en oversikt over dataene, eksempler på bruk, men også en databygger.

    Hvis du har lyst til å komme igang med bruk av dataene, eller bare ønsker å ha en lokal kopi av noen av hoveddataene (med dette tenker jeg strukturelle data som kategorier, representanter, komiteer, fylker, sesjoner og perioder) kan du ta utgangspunkt i dette Python-scriptet som laster ned noen av dataene og legger disse inn i SQLite database. Dette burde være et greit utgangspunkt for videre eksperimentering.

    Script “getBasicData.py”:

    [sourcecode language=”python”]
    # -*- coding: UTF-8 -*-
    import sqlite3
    import httplib
    import urllib2
    import os
    from xml.dom import minidom, Node
    from xml.etree import ElementTree

    SITE = "http://data.stortinget.no/eksport/"
    DATA = "data.db"

    def get_perioder(cur):
    DOK = "stortingsperioder"
    try:
    page = urllib2.urlopen(SITE+DOK)
    except:
    print "Failed to fetch item "+DOK
    if page:
    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[2]
    elements = list(top)
    for el in elements:
           fra = el.find(‘{http://data.stortinget.no}fra’).text
    per_id = el.find(‘{http://data.stortinget.no}id’).text
    til = el.find(‘{http://data.stortinget.no}til’).text
    print "id: %s fra: %s til: %s" % (per_id, fra, til)
    cur.execute("""INSERT INTO perioder(fra, id, til) VALUES(‘%s’,’%s’,’%s’)""" % (fra, per_id, til))
    else:
    print "Could not load page: "+DOK
    return cur

    def get_sesjoner(cur):
    DOK = "sesjoner"
    try:
    page = urllib2.urlopen(SITE+DOK)
    except:
    print "Failed to fetch item "+DOK
    if page:
    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[2]
    elements = list(top)
    for el in elements:
    fra = el.find(‘{http://data.stortinget.no}fra’).text
    ses_id = el.find(‘{http://data.stortinget.no}id’).text
    til = el.find(‘{http://data.stortinget.no}til’).text
    assert attribute in (fra, ses_id, til)
    print "id: %s fra: %s til: %s" % (ses_id, fra, til)
    cur.execute("""INSERT INTO sesjoner(fra, id, til) VALUES(%s, %s, %s)""" % (fra, ses_id, til))
    else:
    print "Could not load page: "+DOK
    return cur

    def get_emner(cur):
    DOK = "emner"
    try:
    page = urllib2.urlopen(SITE+DOK)
    except:
    print "Failed to fetch item "+DOK

    if not page:
    print "Could not load page:!! "+DOK
    return
    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[1]
    elements = list(top)
    for el in elements:
    navn = el.find(‘{http://data.stortinget.no}navn’).text
    main_emne_id = el.find("{http://data.stortinget.no}id").text
    print "HOVED: %s %s" % (navn, main_emne_id)
    cur.execute("""INSERT INTO hovedemner(id, navn) VALUES(‘%s’,’%s’);""" % (main_emne_id, navn))
    if("true" in el.find("{http://data.stortinget.no}er_hovedemne").text):
    for uel in el.find("{http://data.stortinget.no}underemne_liste"):
    navn = uel.find("{http://data.stortinget.no}navn").text
    emne_id = uel.find("{http://data.stortinget.no}id").text
    print "UNDER: %s %s, horer til: %s" % (navn, emne_id, main_emne_id)
    cur.execute("""INSERT INTO underemner(id, navn, hovedemne_id) VALUES(‘%s’, ‘%s’, ‘%s’);""" % (emne_id, navn, main_emne_id))
    return cur

    def get_fylker(cur):
    DOK = "fylker"
    try:
    page = urllib2.urlopen(SITE+DOK)
    except:
    print "Failed to fetch item "+DOK

    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[1]
    elements = list(top)
    for el in elements:
    fylke_id = el.find("{http://data.stortinget.no}id").text
    navn =  el.find("{http://data.stortinget.no}navn").text
    print ("id: %s, navn: %s") % (fylke_id, navn)
    cur.execute("""INSERT INTO fylker(id, navn) VALUES(‘%s’,’%s’);""" % (fylke_id, navn))

    return cur

    def get_partier(cur):
    DOK = "allepartier"
    try:
    page = urllib2.urlopen(SITE+DOK)
    except:
    print "Failed to fetch item "+DOK

    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[1]
    elements = list(top)
    for el in elements:
    parti_id = el.find("{http://data.stortinget.no}id").text
    navn =  el.find("{http://data.stortinget.no}navn").text
    print ("id: %s, navn: %s") % (parti_id, navn)
    cur.execute("""INSERT INTO partier(id, navn) VALUES(‘%s’,’%s’);""" % (parti_id, navn))

    return cur

    def get_komiteer(cur):
    DOK = "allekomiteer"
    try:
    page = urllib2.urlopen(SITE+DOK)
    except:
    print "Failed to fetch item "+DOK

    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[1]
    elements = list(top)
    for el in elements:
    kom_id = el.find("{http://data.stortinget.no}id").text
    navn = el.find("{http://data.stortinget.no}navn").text
    print "id: %s navn: %s" % (kom_id, navn)
    cur.execute("""INSERT INTO komiteer(id, navn) VALUES(‘%s’,’%s’);""" % (kom_id, navn))
    return cur

    def get_representanter(cur):
    DOK = "dagensrepresentanter"
    try:
    page = urllib2.urlopen(SITE+DOK)
    except:
    print "Failed to fetch item "+DOK

    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[1]
    elements = list(top)
    for el in elements:
    doedsdato = el.find("{http://data.stortinget.no}doedsdato").text
    etternavn = el.find("{http://data.stortinget.no}etternavn").text
    foedselsdato = el.find("{http://data.stortinget.no}foedselsdato").text
    fornavn = el.find("{http://data.stortinget.no}fornavn").text
    repr_id = el.find("{http://data.stortinget.no}id").text
    kjoenn = el.find("{http://data.stortinget.no}kjoenn").text
    fylke = el.find("{http://data.stortinget.no}fylke/{http://data.stortinget.no}id").text
    parti = el.find("{http://data.stortinget.no}parti/{http://data.stortinget.no}id").text
    #komiteer = el.find("{http://data.stortinget.no}komiteer_liste/{http://data.stortinget.no}komite/{http://data.stortinget.no}id").text
    print "repr: %s, %s %s, parti: %s, fylke: %s" % (repr_id, fornavn, etternavn, parti, fylke)
    cur.execute("""INSERT INTO representanter(doedsdato, etternavn, foedselsdato, fornavn, id, kjoenn, fylke, parti) VALUES(‘%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’,’%s’);""" % (doedsdato, etternavn, foedselsdato, fornavn, repr_id, kjoenn, fylke, parti))

    return cur

    def create_schema(cur):
    cur.execute("DROP TABLE IF EXISTS perioder")
    perioder = "CREATE TABLE  perioder(fra varchar(255), id varchar(255), til varchar(255))"
    cur.execute("DROP TABLE IF EXISTS sesjoner")
    sesjoner = "CREATE TABLE sesjoner(fra varchar(255), id varchar(255), til varchar(255))"
    cur.execute("DROP TABLE IF EXISTS hovedemner")
    hovedemner = "CREATE TABLE hovedemner(id int, navn varchar(255));"
    cur.execute("DROP TABLE IF EXISTS underemner")
    underemner = "CREATE TABLE underemner(id int, navn varchar(255), hovedemne_id int)"
    cur.execute("DROP TABLE IF EXISTS fylker")
    fylker = "CREATE TABLE fylker(id varchar(255), navn varchar(255));"
    cur.execute("DROP TABLE IF EXISTS partier")
    partier = "CREATE TABLE partier(id varchar(255), navn varchar(255));"
    cur.execute("DROP TABLE IF EXISTS komiteer")
    komiteer = "CREATE TABLE komiteer(id varchar(255), navn varchar(255));"
    cur.execute("DROP TABLE IF EXISTS representanter")
    representanter = "CREATE TABLE representanter(doedsdato varchar(255), etternavn varchar(500), foedselsdato varchar(255), fornavn varchar(500), id varchar(255), kjoenn varchar(255), fylke varchar(255), parti varchar(255));"
    cur.execute(perioder)
    cur.execute(sesjoner)
    cur.execute(hovedemner)
    cur.execute(underemner)
    cur.execute(fylker)
    cur.execute(partier)
    cur.execute(komiteer)
    cur.execute(representanter)
    return cur

    if __name__ == "__main__":
    conn = sqlite3.connect(DATA)
    cur = conn.cursor()
    cur = create_schema(cur)
    cur = get_perioder(cur)
    cur = get_sesjoner(cur)
    cur = get_emner(cur)
    cur = get_fylker(cur)
    cur = get_partier(cur)
    cur = get_komiteer(cur)
    cur = get_representanter(cur)
    conn.commit()
    conn.close

    [/sourcecode]

    Bildet er tatt av Kjell Jøran Hansen og lisensiert under en Creative Commons lisens. Bildet er funnet igjennom Flickr