Göm menyn

729G28 Webbprogrammering och databaser

Projekt del B


Innehåll

Syfte (översikt)

Syftet med denna del är att skapa en databas och fylla den med data. Denna databas ska sedan användas i resten av projektet.

Ni ska utifrån en relationsmodell implementera databasen på en databas-server med hjälp av databasspråket SQL. Ni ska sedan använda er av Python för att läsa in data från de gamla filerna, manipulera datan så att den blir till ett lämpligt format för er databas, och till sist spara datan i databasen.

Observera att del A (ert ER-diagram och relationsschema) måste vara godkända innan ni börjar på del B (skapa databasen och läsa in data). Annars riskerar ni att behöva göra om det ifall ER-diagram eller relationsschema måste ändras. Del B måste sedan vara demonstrerad innan ni börjar på del C.

Redovisning

Redovisning görs muntligt och skriftligt. Muntligt (demonstreras) för labbassistent (helst på labbtid), och följande filer ska sedan lämnas in í Lisam:

  • ProjB_gN_schema.sql
  • ProjB_gN.py Denna fil ska hålla god kodstandard och onödig/bortkommenterad/gammal kod ska tas bort innan inlämning.
Spara filerna i ett zip-arkiv med namnet ProjB_gN.zip, byt ut N mot ert gruppnummer i Webreg. Ingen formell deadline för del B finns men den måste vara demonstrerad för labbassistent innan del C påbörjas.

Instruktioner/Förberedelser

Till er hjälp i denna del har ni ett påbörjat kodskelett i python (länk finns nedan) och ni kan också titta på datafilerna ni använde i SQL-labben för att se hur SQL-kommandon som skapar en databas kan skrivas. För att läsa in, manipulera och skriva ut datamängden ska ni arbeta i Python3. Tips: Detta är likt det ni tidigare gjort i kursen 729G49, Språk och datorer. Speciellt hur man läser in filer och manipulerar textsträngar är nyttigt. Den som känner sig osäker på python-programmering har nytta av att repetera dessa delar. Ni kan också använda reguljära uttryck för att manipulera informationen så den passar in i databasen, men andra metoder fungerar också.

Uppgifter

Först ska databasen skapas med hjälp av SQL:

  1. Bestäm vilka datatyper som behövs för relationerna (tabellerna) genom att undersöka de gamla datafilerna lite noggrannare. Vilka dataformat behövs för att lagra det data som finns där? Hur stora värden behöver representeras - t.ex. hur långa kan strängarna vara, hur stora behöver numeriska värden vara och är det heltal eller decimaltal? Finns det onödig noggranhet i vissa data? Vilka celler kan vara tomma och vilka kan inte vara tomma (dvs var kan det saknas data)? Tips: Python och/eller regexp kan användas till detta.
  2. Skriv SQL-kommandon för att skapa tabeller för de relationer du fått godkända i A-delen. Använd Engine=InnoDB för att aktivera kontrollerna av referensintegritet. Använd de datatyper du identifierade ovan och SQL-constraints för primärnycklar och främmande nycklar.
    Lägg de kommandon som skapar tabellerna i redovisningsfilen projB_gN_schema.sql
    Tips: lägg in DROP TABLE IF EXISTS ... först i redovisningsfilenför att kunna göra source på filen om och om igen tills det blir helt rätt. Tänk efter i vilken ordning DROP-kommandona behöver komma ifall ni har data i tabellerna och behöver göra om detta steg.

Sedan ska databasen fyllas med data med hjälp av python:

  1. Undersök datafilerna ännu en gång, kolla hur ni behöver hantera datat som nu ska stoppas in i tabellerna ni skapat. Notera att vissa kolumner använder flera olika format för samma data (tips: kolla datum-kolumnerna). Modulen Datetime är användbar för att konvertera datum mellan olika format och SQLs DATE-format vill gärna ha indata på formen "YYYY-MM-DD".
    När det saknas data är ibland cellen tom och ibland står det "NULL". I båda dessa fall ska cellen i databasen vara tom (dvs innehålla värdet NULL, inte strängen "NULL") (tips: pythons None konverteras automatiskt till Null i databasen).
    Det kan också vara klokt att ta bort blanksteg som kan förkomma innan eller efter fält som läses in.
    Det är inte säkert att alla lag som omnämns i spelarfilen finns i lagfilen, de får då läggas in efter hand (men "Free agent" är inte ett lag, det betyder att spelaren inte har något nuvarande lag). Ni kan däremot anta att alla lagnamn i spelarfilen är rätt stavade. Notera att i spelarfilen anges lagnamnen i text men de blir referensattribut i en relationsdatabas.
    Kom också ihåg att flera värden per kolumn anges på formen"{xxx|yyyy|zzzz}").
  2. Ladda ner det påbörjade python-kod-skelettet och granska det. Notera att när ni lämnar in er python-kod ska filen heta projB_gN.py, så döp gärna om den direkt. Ni behöver inte skriva all kod i denna fil, dela gärna upp koden för ökad läsbarhet. Om ni lämnar in flera filer ska namnen börja enligt ovan och ha beskrivande namn efter det.
  3. Börja med att bara kolla uppkopplingen till er databas genom att skapa en connector och köra en enkel insert eller annat SQL-kommando.
  4. Gå sedan vidare och skriv kod för att läsa in en fil i taget och loopa igenom all data i filen, och lagra den i era respektive tabeller. Tänk på vilken ordning ni behöver lägga in data för att referensintegriteten ska fungera. Tänk också på att inte hantera data onödigt många gånger.
    Tips 1: Ni kommer att behöva hantera de indata som ni hittade tidigare. Felaktiga format ska konverteras, lag som inte finns ska skapas, NULL-värden läggas in (inte som strängen "NULL"), alla värden tas om hand utan att dubbel-lagring eller lagring av flera värden per cell uppstår. Om det skulle vara så att det som står i informationsfälten i filerna inte stämmer med datafälten kan ni däremot ignorera det.
    Tips 2: Bryt ner denna del i mindre steg, ta en fil i taget; börja med de enkla värdena ta sedan hand om de mer komplicerade kolumnerna. Tänk på att ni lätt kan tömma databasen igen genom att köra er ...schema.sql-fil igen. Strukturera er kod, dela upp i funktioner t.ex. när samma sak görs flera gånger. Tänk på hur databasen fungerar om man försöker lägga in en ny rad med en nyckel som redan finns i tabellen. Tänk på att om man behöver data ur en annan fil är databashanteraren snabbare än att själv öppna och läsa i filen.

Litteratur:

Som vi såg i SQL-labben är LiUs databas-server en MariaDB-server. Den är fullt kompatibel med mysql som beskrivs i ovan litteratur.


Sidansvarig: Eva Ragnemalm
Senast uppdaterad: 2023-12-05