Laboration 5 - MauTwitter med ORM
Introduktion
Jobba gärna i par i denna laboration
I denna laborationen ska vi titta på ett verkligt fall när det är fördelaktigt att använda sig utav arv. Vi kommer att titta på ett bibliotek som heter peewee (http://docs.peewee-orm.com/en/latest/) och som kan användas för att förenkla hanteringen av databaser genom s.k. ORM (objekt-relationell mappning). Wikipedia skriver såhär om ORM:
ORM, står för objekt-relationell mappning (en: object-relational mapping), är ett objektorienterat system som konverterar databastabeller till klasser, tabellrader till objekt, samt celler till objekt-attribut. Active Record (Rails) är ett exempel på ett ORM-lager.
Övning
Vi ska idag bygga ett enkelt meddelandesystem till Malmö Universitet, som mångt och mycket kommer likna en enkel version av Twitter. Vi ska hantera användare och meddelande, samt hålla reda på vilken användare som skrivit vilket tweet. Funktionaliteten kan summeras till:
- Skapa en användare
- Skapa ett meddelande
- Visa alla användare
- Visa alla meddelande
- Visa alla meddelande av en given användare
Programmet skulle ju sedan kunna byggas ut ytterligare genom att t.ex. kräva lösenord för att logga in, ge möjlighet att sortera meddelande genom likes, kunna redigera / radera meddelande, etc.
Klassdiagram
Som hjälp på traven för att komma igång får ni ett klassdiagram, studera det snabbt:

Vi kan identifiera klasserna:
- App, som sköter körningen av programmen
- MauTwitter, som ansvarar för alla användare och meddelande
- User, som är en modell av hur en användare ser ut, och modelleras i databasen
- Message, som är en modell av hur ett meddelande ser ut, och modelleras i databasen
- BaseModel, som är en modell som specificerar vår databas
- Meta, som är en subklass till BaseModel (eftersom det är såhär
peeweevill att man specificerar databasanslutningen) - peewee.Model, som är en klass i biblioteket
peeweeför att möjliggöra enklare databashantering
Ni får klassen BaseModel, resten är upp till er att bygga. Bra och tydlig dokumentation finns på peewees webbplats: http://docs.peewee-orm.com/en/latest/peewee/quickstart.html. Vi kommer, enligt specificerat nedan, använda oss utav en SQLite-databas i denna laboration.
import peewee as pw
db = pw.SqliteDatabase("MauTwitter.db")
class BaseModel(pw.Model):
''' This is the base class from which all our other classes will inherit. The
benefit of having a common class is that we don't have to set the configuration
in every other class.'''
class Meta:
''' In Meta nested class we provide the configuration '''
database = db
Installera peewee
Eftersom vi kommer att använda peewee, ett bibliotek som inte är standar i Python, behöver vi installera det enligt följande:
pip install peewee
Om ni kör MAC så kan ni behöva skriva pip3 istället för pip, beroende på hur er miljö ser ut.
Mer specifika instruktioner kring installationen hittar ni här: http://docs.peewee-orm.com/en/latest/peewee/installation.html#installation
Tips
- Tänk på att ni är noga att specificera hur era modeller (
UserochMessage) ser ut, då detta kommer att generera databas-tabeller sedan. Mer läsning här: http://docs.peewee-orm.com/en/latest/peewee/models.html#field-types-table - Vill ni se hur er databas ser ut (och utvecklas) så kan ni t.ex. ladda ner tillägget
SQLitetill Visual Studio Code (eller något annat program som gör detta åt er). - De flesta av era frågor besvaras troligen genom Quickstart-guiden på
peewees webbplats: http://docs.peewee-orm.com/en/latest/peewee/quickstart.html - Behöver man uppdatera sig om främmande nycklar (eng. foreign keys), kan man göra det här: http://www.databasedev.co.uk/primary_foreign_key_constraints.html
- I klassdiagrammet så tar vissa funktioner ett “argument” som är
**kwargs. Detta innebär att den tar emot alla key word-argument som skickas till funktion, det kan t.ex. fungera på detta sätt:def create_user(**kwargs): '''Skapar en användare i databasen''' return User.create(**kwargs) create_user(username="Tibbe", full_name="Anton Tibblin", password="abc123", email="anton.tibblin@mau.se")
Exempelkörning av programmet
Körning 1:
Ange användarnamn: Tibbe
> Din användare finns inte, låt oss skapa användaren!
Ange ditt hela namn: Anton Tibblin
Ange ditt lösenord: abc123
Ange din epost-adress: anton.tibblin@mau.se
> Användare skapad, välkommen Tibbe!
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 1
> Det finns inga meddelande
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 3
----------
Användare
----------
Tibbe (Anton Tibblin)
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 4
----------
Skapa ett meddelande!
----------
> Hello World!
Tack för ditt meddelande!
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 1
----------
Meddelande
----------
Tibbe (2019-10-14 00:19:38): Hello World!
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 0
Körning 2
Ange användarnamn: Tibbe
> Välkommen tillbaka Tibbe!
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 4
----------
Skapa ett meddelande!
----------
> This is so fun!
Tack för ditt meddelande!
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 2
Användarnamn: Tibbe
----------
Meddelande
----------
Tibbe (2019-10-14 00:19:38): Hello World!
Tibbe (2019-10-14 00:19:56): This is so fun!
**********
1) Visa alla meddelande
2) Visa meddelande från en specifik användare
3) Visa alla användare
4) Skapa en meddelande
0) Avsluta
**********
Val: 0