Laboration 5 - MauTwitter med ORM

Ni hittar lösningsförslag här

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:

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:

http://webshare.mah.se/tsanti/uml-mau-twitter.png

Vi kan identifiera klasserna:

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

  1. Tänk på att ni är noga att specificera hur era modeller (User och Message) 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
  2. Vill ni se hur er databas ser ut (och utvecklas) så kan ni t.ex. ladda ner tillägget SQLite till Visual Studio Code (eller något annat program som gör detta åt er).
  3. De flesta av era frågor besvaras troligen genom Quickstart-guiden på peewees webbplats: http://docs.peewee-orm.com/en/latest/peewee/quickstart.html
  4. 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
  5. 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