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 er 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 om del A inte är godkänd när ni börjar med del B kommer ändringar av relationsmodellen i del A att påverka det ni gör här. Del B bör sedan vara demonstrerad innan ni börjar på del C av samma anledning.
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_gNN_schema.sql
ProjB_gNN.py
Denna fil ska hålla god kodstandard och onödig/bortkommenterad/gammal kod ska tas bort innan inlämning.
Instruktioner/Förberedelser
Läs på om hur man skapar tabeller i SQL i kurslitteraturen. För att fylla tabellerna med data finns ett påbörjat kodskelett i python3 (länk finns nedan) som hjälp. 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 även om det finns andra sätt att manipulera textsträngar än regex. Den som känner sig osäker på python-programmering har stor nytta av att repetera det.
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 regex kan användas till detta.
- Skriv SQL-kommandon för att skapa tabeller för de relationer
ni utformat i A-delen. Använd
Engine=InnoDB
för att aktivera kontrollerna av referensintegritet. Använd de datatyper ni identifierade ovan och SQL-constraints för primärnycklar och främmande nycklar.
Lägg de kommandon som skapar tabellerna i redovisningsfilenprojB_gNN_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. Det är ett smidigt sätt att nollställa databasen om något går fel vid inläggningen av data, så att man måste börja om från början.
Sedan ska databasen fyllas med data med hjälp av python:
- Undersök datafilerna ännu en gång, kolla hur ni
behöver manipulera datat som nu ska stoppas in i tabellerna
ni skapat. Följande krav ska uppfyllas i er databas:
- Alla celler i en viss kolumn har samma datastruktur och datatyp. I rådatafilerna anges datum på flera olika sätt som måste konverteras till samma format. Tips: 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").
- Alla celler som inte har något data ska ha värdet NULL (inte strängen "NULL" eller något annat). I rådatafilerna finns det både tomma celler och celler med strängen "NULL". Tips: pythons None konverteras automatiskt till Null i databasen).
- Celler med textinnehåll får inte ha blanktecken först.
- Alla celler ska ha atomära värden. I rådatafilerna finns celler med flera värden, de har alltid formatet "{xxx|yyyy|zzzz}".
- Alla lag som används i spelarfilen finns inte i lagfilen, de ska då läggas in som nya lag efter hand (men "Free agent" är inte ett lag, det betyder att spelaren inte har något nuvarande lag). Ni kan 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.
- 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_gNN.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.
Tips 1: Tänk på vilken ordning ni behöver ta filerna för att referensintegriteten ska fungera. Att lösa detta genom att läsa igenom rådatafilerna flera gånger per styck eller lagra hela databasen internt i pythonprogrammet innan det skrivs ut till databasen är inte okej, det skulle inte fungera om databasen var större.
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.
När ni lämnar in ska er pythonkod vara väl kommenterad, följa god kodstandard och inte innehålla bortkommenterad kod eller kod som inte används.
Litteratur:
Utöver kurslitteraturen kan följande vara matnyttigt:
- 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: 2025-09-17