Databaser. TDDD80 Mobila och sociala applikationer

Relevanta dokument
Databaser. TDDD80 Mobila och sociala applikationer

Inloggning. TDDD80 Mobila och sociala applikationer

Databasens består av: Tabell Kolumner fält Rader poster (varje post är unik)

Vad är en databas? Exempel på databaser: Databas = Organiserad samling och lagring av information.

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

Lösningar till tentamen i EDAF75

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Starta MySQL Query Browser

WCMS-15, Webbutvecklare CMS

Databasföreläsning. Del 2 lagrade procedurer, vyer och transaktioner

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Databaser. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

1.Lär känna MS SQL Observera. Tips. Förberedelse

Labb LIVE. Exempelkod från föreläsningen. Plushögskolan Frågeutveckling inom MSSQL - SU14

Mål med lektionen! Veta kursmålen. Ha kännedom om några av de grundläggande begreppen.

Viva la evolución. Peter Backlund

Sample exam questions. Database exam TIG058

FactoryCast HMI. Premium & Quantum PLC. MySQL Server och FactoryCast HMI databastjänst

Lär känna MS SQL 2008 / Övning. Observera. Tips. Förberedelse

Databaser och Datamodellering Foreläsning IV

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

INTRODUKTION TILL JDBC

Introduktion till Entity Framework och LINQ. Källa och läs mer

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Karlstads Universitet, Datavetenskap 1

ADO.NET Murach Kapitel 17-20

Konceptuella datamodeller

Labb LABB 1. Databassagan och en rundtur i databasers märkliga värld. Plushögskolan Frågeutveckling inom MSSQL - SU14

Uppstart Inloggning SSMS Skapa Databas Skapa Tabell Skapa Diagram, Fk, RI Hantering av Index, Pk, Fk, Ix Constraints Beräknande fält Några funktioner

Databaser. Vad du ska lära dig: Ordlista

Language Integrated Query, LINQ, och databaser

Övningar i SQL. SQLAccess.doc Ove Lundgren

Android översikt. TDDD80 Mobila och sociala applikationer

Klientprogrammering mot databaser

ÖVERVAKNING AV SQL SERVER

MVC med Javascript och Ajax. Filip Ekberg

Trafla databasen vi hämtar data från (remote export) ligger på en godtycklig maskin i nätverket. Den här databasen är en MIMER databas.

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Sätt att skriva ut binärträd

Karlstads Universitet, Datavetenskap 1

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Introduk+on +ll programmering i JavaScript

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

DDL Kommandon CREATE/DROP Database CREATE /ALTER/DROP Table ALTER/ADD/DROP Column CREATE /ALTER/DROP Index

Mål med lektionen! Repetera och befästa kunskaperna.

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Core Data Permanent datalagring

Tentamen DATABASTEKNIK - 1DL116, 1MB025

Funktionsbeskrivning

Structured query language (SQL)

Föreläsning 3: Booleans, if, switch

JobOffice SQL databas på server

Exemple på Tentauppgifter Webbprogrammering

Innehåll. Föreläsning 3. javax.naming.context. javax.sql.datasource. Vad är JDBC? Java Naming and Directory Interface(JNDI) Viktigaste metoder:

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

TENTAMEN DATABASKUNSKAP ITEK12

Modern webbutveckling. av Robert Welin-Berger

Webbprogrammering, grundkurs 725G54

VAD GÖR DU / VEM ÄR DU?

Sätta upp e-post server Ubuntu 14.04, del 1 installation av programvara, konfiguration av mysql och Postfix

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

För att XCOPY i SQL Server Express ska fungera måste data och logg ligga i samma mapp, vilket naturligtvis inte är så bra.

Appar med ryggrad. Introduktion till JavaScriptramverket Backbone

Att skriva till och läsa från terminalfönstret

08/11/13. Databasteknik och informationssystem DD1370 F3. Ett urval ur databasen bestäms av en SQL-fråga. Påminnelse: Deadline på tisdag

Skapa exempeldatabasen

Filbeskrivningar Eller på särskild CD skiva

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Laboration: Whitebox- och blackboxtesting

Evodev AB web epost Telefon Fax

NORMALISERING. Mahmud Al Hakim

TDP013. Node.js, Mocha, Istanbul. Anders Fröberg Institutionen för Datavetenskap

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Skapa din egen MediaWiki

07/11/14. Databasteknik och informationssystem DD1370 F2. Allmänna frågor. Är Lab0 svårbegriplig? Nu: Clickers. Är Kurswebben svårbegriplig?

Föreläsning 8: Exempel och problemlösning

Föreläsning 2: Översikt över ett databassystem

Asp.net mvc intro PER KVARNBRINK,

PAINTFEUD. Erfarenheter

Webservice & ERP-Integration Rapport

ASP.NET MVC. Copyright Mahmud Al Hakim Innehåll

Android översikt. TDDD80 Mobila och sociala applikationer

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Databaser och SQL - en kort introduktion

Att bygga enkel webbapplikation i Docker

Lab 6: ASP.NET 2.0 Providermodellen

Statistiska centralbyrån

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

MySQL - testmiljöer på minuter. Thomas Johansson IT-avdelningen

INTRODUKTION TILL ANGULAR JS

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Spara papper! Skriv inte ut sammanfattning utan ladda ner PDF!

TDP002 - Imperativ programmering

Design och underhåll av databaser

JAVASCRIPT. Beteende

Databasutveckling Tabeller. tinyint 1 byte (0-255) Upp till 8 bytes

Transkript:

Databaser TDDD80 Mobila och sociala applikationer

Översikt Relationsdatabaser (tabeller) SQL (Structured Query Language) Relationsmodeller Många-till-många relationer Alchemy Enhetstestning Modulär kod designmönstret MVC

18-01-21 Olika typer av databaser Relationsdatabaser (SQL-databaser) Fokus på entiteter och relationer mellan dessa Tabeller Unika rader NoSQL databaser Dokument-orienterade databaser (t.ex. MongoDB) JSON-databaser (t.ex. Firebase) Key-value databaser (Redis)

SQLite Liten SQL-databas som kan lagras på en fil Oftast lokalt på egen dator Används med fördel för utveckling och testing

18-01-21 Entity-relationship diagram (ER) en många noll el. många

18-01-21 Relationsdatabaser har tabeller ISBN titel författare

18-01-21 Nycklar Varje tabell har primär nyckel (ID) Alltid unik för varje rad Dvs. varje relationstupel kan hittas entydigt via primär nyckeln Foreign key Referens till annan tabells primär nyckel T.ex. länka bok till bok-exemplar, till lån, etc.

Tabeller (exempel) Foreign key (kopplar till annan tabell) primär nyckel (för denna tabell) primär nyckel (för denna tabell) data saknas (motsv. ingen som har läst detta meddelande)

Schema ( tabellhuvud ) Mall, bestämmer vilka kolumner som ingår i tabellen Namn Typ av tillåtna värden Integer String Constraints Unik Non-null

Data (tabellrader) Läggs till t.ex. när app körs Krux Singulära värden i tabellen, dvs. ej listor, etc. Ställer krav på hur data organiseras i tabeller Relationsmodellering

Relationsmodeller ER (Entity-Relationship diagrams )

18-01-21 many one

Modell = data + relationer mellan dessa One-to-one relation Kan läggas i samma tabell Men, kanske konceptuellt tydligare i två tabeller One-to-many Två tabeller, där den ena länkar till den andra via foreign key

One-to-many relation

Many-to-many relation associationstabell

18-01-21 Associationstabell

SQL Structured Query Language

Structured Query Language (SQL) Microsoft Access Vill ha ut dessa två kolumner SELECT [Firstname], [Lastname] FROM [Employees] WHERE [Lastname] = "Davolio"; Från dennatabell Dettakriterium

18-01-21 Ibland måste tabeller kombineras Ge mig alla avdelningar och dess chef, i hela företaget Två tabeller behöver kombineras! tabell kolumn SELECT Employees.[Department], Managers.[Manager] FROM Employees INNER JOIN Managers WHERE Employees.[Department] = Managers.[Department];

Inner join B 1 D 2 F 3 A B C D E B 1 D 2 A INNER JOIN B behåll bara matchande rader

Left join (outer join) B 1 D 2 F 3 A B C D E A B 1 C D 2 E A LEFT JOIN B behåll alla rader från B

Right join (outer join) B 1 D 2 F 3 A B C D E x z g h p B 1 z D 2 h F 3 A RIGHT JOIN B alla rader från A

Join Läs mer på: https://community.qlik.com/thread/39177

SQLAlchemy

SQLAlchemy Object-Relational Mapper (ORM) Du kan definiera klasser och metoder som vanligt SQLAlchemy översätter Klass till tabell Variabler till kolumner Metoder till queries

Sätta upp en databas from flask_sqlalchemy import SQLAlchemy db_path = os.path.join(os.path.dirname( file ), 'app.db') db_uri = 'sqlite:///{}'.format(db_path) app.config['sqlalchemy_database_uri'] = config.db_uri app.config['sqlalchemy_track_modifications'] = True db = SQLAlchemy(app)

Flask-SQLAlchemy Configurerar Alchemy, ger db-objekt Tabell: class User(db.Model): tablename = 'users' id = db.column(db.integer, primary_key=true) name = db.column(db.string(5))

Exempel (Flask-SQLAlchemy) class User(Base): tablename = 'users' id = Column(Integer, Sequence('user_id_seq'), primary_key=true) name = Column(String(50)) fullname = Column(String(50)) password = Column(String(12)) def repr (self): return "<User(name='%s', fullname='%s', password='%s')>" % ( self.name, self.fullname, self.password)

Flask-SQLAlchemy queries inom klassdef class User(db.Model): #... def follow(self, user): if not self.is_following(user): self.followed.append(user) return self def unfollow(self, user): if self.is_following(user): self.followed.remove(user) return self https://blog.miguelgrinberg.com/post/the-flask-megatutorial-part-viii-followers-contacts-and-friends def is_following(self, user): return self.followed.filter(followers.c.followed_id == user.id).count() > 0

SQLAlchemy query (forts) Tillåter vanlig python -syntax Dina egna data-repr i form av klasser och objekt T.ex. message.users.append(user) Bakom ligger databas-tabeller och SQL-queries

Tre lager av query-syntax Flask-SQLAlchemy Konfigurerar Alchemy åt oss, förenklad syntax (query_by, etc.) Alchemy Kan använda Klasser och vanliga metoder istf lågnivå SQL-queries SQL Allt översätts till SQL som loggas om man är i debug-mode

18-01-22 Exempel1 db.session.query(employees.lastname). filter_by(lastname= Davalio ).all() Employees.query. filter(last_name= Davalio ).all() SELECT [lastname] FROM [Employees] WHERE [lastname] = "Davolio";

18-01-22 Exempel2 db.session.query(user). filter(user.name.like('%ed')).order_by(user.id) SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE users.name LIKE? ORDER BY users.id ('%ed',)

18-01-22 Join i Alchemy (exempel) db.session.query(message).join(user). filter(user.name == Kalle ).all() Skapar en sammanslagen tmp-tabell, med kolumner från båda tabellerna och de rader som matchar (jfr. outerjoin) Se vidare: http://docs.sqlalchemy.org/en/latest/orm/query.html

18-01-22 Dynamic queries Om man anger lazy= dynamic i sin tabell-def: Query exekveras inte utan kan byggas på Kan lägga på ytterligare filter på en query Exekveras vid trigger, t.ex. all() Ändringar i databasen måste commit:as

18-01-22 Alchemy session Ändringar i databasen måste commit:as Tex. skapa nytt objekt från User db.session.add(user1) Session.dirty flaggar nu True db.session.commit() Lägg in ändringar i databasen

Many-to-many relationer survey_questions = db.table( 'survey_questions', db.column('survey_id', db.integer, db.foreignkey('surveys.id')), db.column('question_id', db.integer, db.foreignkey('questions.id'))) class Survey(db.Model): tablename = 'surveys' id = db.column(db.integer, primary_key=true) name = db.column(db.string(50), unique=true) ending = db.column(db.datetime) class Question(db.Model): tablename = 'questions' id = db.column(db.integer, primary_key=true) text = db.column(db.text) help = db.column(db.text)

18-01-22 Ytterligare exempel read_by = db.table( 'read_by', db.column('user_id', db.integer, db.foreignkey('users.id')), db.column('message_id', db.integer, db.foreignkey('messages.id ))) class User(db.Message): tablename = messages

Exempel på vanlig tabell class Message(db.Model): tablename = 'messages' id = db.column(db.integer, primary_key=true) mess_id = db.column(db.integer, unique=true) message = db.column(db.string(140)) users = db.relationship('user', secondary=read_by, primaryjoin=(read_by.c.message_id == id), # back_populates='messages', backref=db.backref('messages', lazy='dynamic'), lazy="dynamic")

Many-to-many relationships Läs vidare på: http://www.ergo.io/blog/sqlalchemy-relationshipsfrom-beginner-to-advanced/ http://docs.sqlalchemy.org/en/latest/orm/tutorial.h tml Klicka på navigationsfältet: Building a Many to Many Relationship

Statiskt schema dynamiska data

Statiska klasser dynamiskt skapade objekt Java Klasser statiska (finns i koden, filerna) Objekt skapas när ett javaprogram körs igång Skilda världar Kan t.ex. inte komma åt vanliga variabler förrän ett objekt har skapats som är värd för variabeln Detta eftersom olika objekt kan ha olika värden på samma variabel mytriangle = new Triangle().setColor( Red ) histriangle = new Triangle().setColor( Blue )

Modell databas Modell (databas-schema) statisk Anger vilken typ av data som ska repr Databas dynamisk Innehåller data från en speciell körning Data för företag X vs. data för företag Y Data under utveckling och testning!= data för deployment (sjösatt system)

Kod som ska sjösättas All kod Utom log-filer, etc. Datamodell Ej själva databasen Databasen skapas dynamiskt på plats (på den server som ska hantera de riktiga kunderna) Databasen ska inte versionshanteras Om man inte vill ha hårdlödd databas

Enhetstestning

Skickar fejk requests Sätter upp test-databas med start-data Kör ett antal testfall Varje testfall: sekvens av anrop som bygger upp scenen T.ex. Steg för steg, lägg i 2 meddelanden i databasen, med första meddelandet läst av Kalle Slutligt anrop som utvärderas i scenen som skapades

Exempel def test_mark_and_retrieve_message(self): payload = {'message': 'hej3'} rv = self.app.post('/messages', data=json.dumps(payload), content_type='application/json') message_id1 = rv.data assert rv.status_code == 200 assert len(message_id1) == 8 rv = self.app.post('/messages/' + message_id1 + '/flag/' + user_name1) assert rv = self.app.get('/messages/unread/' + user_name2) assert b'hej3' in rv.data assert b'hejhej3' in rv.data

Sätta upp/ta ner tmp-databas def setup(self): self.db_fd, app.config['database'] = tempfile.mkstemp() app.config['testing'] = True self.app = app.test_client() with app.app_context(): data.initialize_db() Anrop till egen databashanteringsmodul def teardown(self): os.close(self.db_fd) os.unlink(app.config['database'])

MVC (Model-View-Controler)

MVC Databashanteringskod Serverkod (views)

Modulär kod Bra om kod kan återanvändas T.ex. db-anrop direkt från unit_test Bra om db och views kan bytas oberoende av varandra, dvs. plug-n-play Lägg @app.route metoderna i server.py eller views.py Lägg databas-hantering i egen modul (egen mapp eller fil)

18-01-22 Cirkulära referenser Problem att vyn är beroende av data och vice versa (för initiering av db) Läs mer på: http://flask.pocoo.org/docs/0.12/patterns/packa ges/

18-01-22 Modulär kodstruktur app.py from lab2 import app if name ==' main ': app.run(host='0.0.0.0, port=8080)

18-01-22 Modulär kodstruktur init.py from lab2 import config app = Flask( name ) app.config['debug'] = config.debug_flag app.config['sqlal '] = config.db_uri import lab2.server

18-01-22 Modulär kodstruktur server.py from lab2 import app from lab2 import data data.initialize_db()

18-01-22 Modulär kodstruktur data.py from lab2 import app db = SQLAlchemy(app)

rita.kovordanyi@liu.se www.liu.se