Web Programming
with Python and JavaScript
SQL, Models, and Migrations
Data
origin destination duration
New York London 415
Shanghai Paris 760
Istanbul Tokyo 700
New York Paris 435
Moscow Paris 245
Lima New York 455
SQL
Database Management Systems
• MySQL
• PostgreSQL
• SQLite
• ...
SQLite Types
• TEXT
• NUMERIC
• INTEGER
• REAL
• BLOB
MySQL Types
• CHAR(size)
• VARCHAR(size)
• SMALLINT
• INT
• BIGINT
• FLOAT
• DOUBLE
• ...
CREATE TABLE
CREATE TABLE flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
duration INTEGER NOT NULL
);
Constraints
• CHECK
• DEFAULT
• NOT NULL
• PRIMARY KEY
• UNIQUE
• ...
INSERT
INSERT INTO flights
(origin, destination, duration)
VALUES ("New York", "London", 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ("New York", "London", 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ("New York", "London", 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ("New York", "London", 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ("New York", "London", 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ("New York", "London", 415);
SELECT
SELECT * FROM flights;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT origin, destination FROM flights;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT origin, destination FROM flights;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE id = 3;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE id = 3;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE origin = "New York";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE origin = "New York";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500;
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500
AND destination = "Paris";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500
AND destination = "Paris";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500
OR destination = "Paris";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500
OR destination = "Paris";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE
origin IN ("New York", "Lima");
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE
origin IN ("New York", "Lima");
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE
origin LIKE "%a%";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE
origin LIKE "%a%";
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
Functions
• AVERAGE
• COUNT
• MAX
• MIN
• SUM
• ...
UPDATE
UPDATE flights
SET duration = 430
WHERE origin = "New York"
AND destination = "London";
UPDATE flights
SET duration = 430
WHERE origin = "New York"
AND destination = "London";
UPDATE flights
SET duration = 430
WHERE origin = "New York"
AND destination = "London";
UPDATE flights
SET duration = 430
WHERE origin = "New York"
AND destination = "London";
UPDATE flights
SET duration = 430
WHERE origin = "New York"
AND destination = "London";
UPDATE flights
SET duration = 430
WHERE origin = "New York"
AND destination = "London";
DELETE
DELETE FROM flights WHERE destination = "Tokyo";
DELETE FROM flights WHERE destination = "Tokyo";
DELETE FROM flights WHERE destination = "Tokyo";
DELETE FROM flights WHERE destination = "Tokyo";
DELETE FROM flights WHERE destination = "Tokyo";
Other Clauses
• LIMIT
• ORDER BY
• GROUP BY
• HAVING
• ...
Foreign Keys
flights
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
flights
id origin origin_code destination destination_code duration
1 New York JFK London LHR 415
2 Shanghai PVG Paris CDG 760
3 Istanbul IST Tokyo NRT 700
4 New York JFK Paris CDG 435
5 Moscow SVO Paris CDG 245
6 Lima LIM New York JFK 455
airports
id code city
1 JFK New York
2 PVG Shanghai
3 IST Istanbul
4 LHR London
5 SVO Moscow
6 LIM Lima
7 CDG Paris
8 NRT Tokyo
flights
id origin destination duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
flights
id origin_id destination_id duration
1 1 4 415
2 2 7 760
3 3 8 700
4 1 7 435
5 5 7 245
6 6 1 455
passengers
id first last flight_id
1 Harry Potter 1
2 Ron Weasley 1
3 Hermione Granger 2
4 Draco Malfoy 4
5 Luna Lovegood 6
6 Ginny Weasley 6
people
id first last
1 Harry Potter
2 Ron Weasley
3 Hermione Granger
4 Draco Malfoy
5 Luna Lovegood
6 Ginny Weasley
passengers
person_id flight_id
1 1
2 1
2 4
3 2
4 4
5 6
6 6
JOIN
SELECT first, origin, destination
FROM flights JOIN passengers
ON passengers.flight_id = flights.id;
first last origin
Harry Potter New York
Ron Weasley New York
Hermione Granger Shanghai
Draco Malfoy New York
Luna Lovegood Lima
Ginny Weasley Lima
JOINs
• JOIN / INNER JOIN
• LEFT OUTER JOIN
• RIGHT OUTER JOIN
• FULL OUTER JOIN
CREATE INDEX
CREATE INDEX name_index ON passengers (last);
SQL Injection
Username:
Password:
SELECT * FROM users
WHERE username = username AND password = password;
Username:
harry
Password:
12345
SELECT * FROM users
WHERE username = username AND password = password;
SELECT * FROM users
WHERE username = "harry" AND password = "12345";
Username:
hacker" --
Password:
SELECT * FROM users
WHERE username = username AND password = password;
SELECT * FROM users
WHERE username = "hacker"--" AND password = "";
SELECT * FROM users
WHERE username = "hacker"--" AND password = "";
Race Conditions
Models
SQL, Models, and Migrations
Web Programming
with Python and JavaScript