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.
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:
- 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.
- 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 redovisningsfilenprojB_gN_schema.sql
Tips: lägg inDROP TABLE IF EXISTS ...
först i redovisningsfilenför att kunna görasource
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:
- 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}"). - 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.
- 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.
- Gå sedan vidare och skriv kod för att läsa in en
fil i taget, loopa
igenom all data i filen och lagra den i era
respektive tabeller. Tänk på vilken ordning ni behöver
ta filerna för att referensintegriteten ska
fungera och för att ni ska slippa läsa igenom filerna flera gånger.
Tips 1: Ni behöver inte fundera över innehållet i strängar som t.ex. "information" eller dela upp innehållet i dem (t.ex. "BirthPlace"), bara kolla om strängar inleds med blanktecken.
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:
- Manualen för att läsa csv-filer (python.org)
- En PyMySQL tutorial. Observera att om du kör på LiUs datorer (fysiskt eller via thinlinc) finns PyMySQL redan installerat, du behöver bara importera det.
- Exempel på csv.DictReader
- Här finns ett exempel på hur man använder en MySQL-databas med PyMySQL (även här visas installation som inte behövs på LiUs Linux-system).
- Mer information om PyMySQL finns här (mysqldb) (OBS! pymysql använder samma funktioner som mysqldb)
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: 2024-10-24