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.

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

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

Starta MySQL Query Browser

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

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

WCMS-15, Webbutvecklare CMS

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

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

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

Sample exam questions. Database exam TIG058

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

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

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

Viva la evolución. Peter Backlund

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.

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

Karlstads Universitet, Datavetenskap 1

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

Konceptuella datamodeller

INTRODUKTION TILL JDBC

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

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

Databaser och Datamodellering Foreläsning IV

Databaser. Vad du ska lära dig: Ordlista

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

Modern webbutveckling. av Robert Welin-Berger

ADO.NET Murach Kapitel 17-20

Övningar i SQL. SQLAccess.doc Ove Lundgren

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

Android översikt. TDDD80 Mobila och sociala applikationer

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.

ÖVERVAKNING AV SQL SERVER

Structured query language (SQL)

MVC med Javascript och Ajax. Filip Ekberg

Language Integrated Query, LINQ, och databaser

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

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

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.

Tentamen DATABASTEKNIK - 1DL116, 1MB025

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

Introduk+on +ll programmering i JavaScript

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

Klientprogrammering mot databaser

Skapa exempeldatabasen

Filbeskrivningar Eller på särskild CD skiva

Funktionsbeskrivning

NORMALISERING. Mahmud Al Hakim

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

Webservice & ERP-Integration Rapport

Skapa din egen MediaWiki

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

F4. programmeringsteknik och Matlab

Design och underhåll av databaser

Asp.net mvc intro PER KVARNBRINK,

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

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

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

Evodev AB web epost Telefon Fax

Concepts learned this far. ER till relationer. ER till relationer. ER till relationer. TDDD12 Database Technology

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

TER3. Försättsblad till skriftlig tentamen vid Linköpings universitet G28 TEN1 Webprogrammering och databaser Tentamen IDA 1 (7)

Lab 6: ASP.NET 2.0 Providermodellen

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

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

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

JobOffice SQL databas på server

Prova på-laboration i SQL

Webbprogrammering, grundkurs 725G54

Relationsmodellen och syntetisk databasdesign

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

Karlstads Universitet, Datavetenskap 1

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

Classes och Interfaces, Objects och References, Initialization

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

Sätt att skriva ut binärträd

Genomgång av tentamen. Databasteknik ITHS 4/3 2016

Tentamen DATABASTEKNIK - 1DL116

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

Objektorienterad Programmering (TDDC77)

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

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

TDP002 - Imperativ programmering

TENTAMEN DATABASKUNSKAP ITEK12

DVA234 Databaser. Dag Nyström, Introduktion till databaser och MS SQL Server

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

1. SQL DDL (Data Definition Language) 2. Skapa tabell

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

Disposition. 1. Kopplingen mellan Processanalys (DFDdiagram) 2. Treskikts Client-Server arkitektur (Fig 1.8) 3. Data layer

Python. Datatyper. Mer om datatyper. Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam!

Exemple på Tentauppgifter Webbprogrammering

Läsöversikt. Föreläsningar 2-6. Genomförande av laborationer

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

Sammanfattning. Applikationen är utvecklad i Microsofts utvecklingsmiljö Visual Studio 2012.

Statistiska centralbyrån

Transkript:

Databaser TDDD80 Mobila och sociala applikationer

Översikt Relationsdatabaser SQL Relationsmodeller Många-till-många relationer Alchemy Enhetstestning Modulär kod designmönstret MVC

Olika typer av databaser Relationsdatabaser (SQL-databaser) Fokus på entiteter och relationer mellan dessa Tabeller Unika rader No-SQL databaser Dokument-orienterade databaser (t.ex. MongoDB) JSON-databaser (t.ex. Firebase)

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

Relationsdatabaser har tabeller

Schema Bestämmer vilka kolumner som ingår i tabellen Namn Typ av tillåtna värden Integer String Constraints Unik Non-null

Nycklar Varje tabell har Primary key (ID, dvs. primär nyckel) Alltid unik för varje rad Dvs. varje relationstupel kan adresseras entydigt via ID Foreign key Referens till annan tabells primary key

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)

Data = tupler Data fylls på vid initialisering, genom anrop, etc. 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 )

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

Many-to-many 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

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

Måste använda join När olika delar av en query finns i olika tabeller T.ex. Hitta alla länder i Asien som har arbetslöshet > 3% Geographical location Socioeconomic conditions Country ID Name Continent 1 Japan Asia 2 India Asia 3 USA America Country ID Unemployment rate 3 10% 1 2 4% 2 1 2.6% 4

Join Förutsätter att båda tabeller har kolumn med matchande värden A: target table B: join table 1 1 2 1 3 2 Unik kolumn: primary key

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

17-01-23 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))

17-01-23 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

17-01-23 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)

17-01-23 Flask-SQLAlchemy query 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

17-01-23 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

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

17-01-23 Exempel2 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',) db.session.query(user). filter(user.name.like('%ed')).order_by(user.id)

17-01-23 Many-to-many associationstabell

17-01-23 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)

17-01-23 Ytterligare exempel read_by = db.table( 'read_by', db.column('user_id', db.integer, db.foreignkey('users.id'), primary_key=true), db.column('message_id', db.integer, db.foreignkey('messages.id'), primary_key=true))

Associationstabell read_by = db.table('read_by', db.model.metadata, db.column('user_id', db.integer, db.foreignkey('users.id'), primary_key=true), db.column('message_id', db.integer, db.foreignkey('messages.id'), primary_key=true)) class User(db.Message): tablename = messages

17-01-23 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

17-01-23 Join i Alchemy (exempel) db.session.query(message).join(message.users). filter(user.name == Kalle ).all() Skapar en sammanslagen tmp-tabell, med kolumner från båda tabellerna och de rader som matchar (jfr. outerjoin)

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

17-01-23 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

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

Motsvarar gamla requests-filen med anrop Sätter upp databas med start-data Kör ett antal testfall Varje testfall: sekvens av anrop som sätter scenen T.ex. Nu bör 2 meddelanden ligga 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

Cirkulära referenser Problem att vyn är beroende av data och vice versa (gäller vid initiering) Läs mer på: http://flask.pocoo.org/docs/0.10/patterns/packa ges/

17-01-24 Modulär kodstruktur init.py from lab2 import config app = Flask( name ) # app.config import lab2.server server.py from lab2 import app... from lab2 import data data.initialize_db() data.py from lab2 import app db = SQLAlchemy(app) run_server.py from lab2 import app, config app.run(port=config.port)

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