|
@@ -0,0 +1,70 @@
|
|
|
|
+import csv
|
|
|
|
+from datetime import datetime
|
|
|
|
+import io
|
|
|
|
+import psycopg2
|
|
|
|
+from urllib import request
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+conn = psycopg2.connect(dbname='postgres', user='postgres')
|
|
|
|
+cur = conn.cursor()
|
|
|
|
+# Autocommit instead of commiting every transaction.
|
|
|
|
+conn.autocommit = True
|
|
|
|
+
|
|
|
|
+# Create database and users.
|
|
|
|
+cur.execute('CREATE DATABASE ihw')
|
|
|
|
+cur.execute("CREATE USER production WITH PASSWORD 'abc123'")
|
|
|
|
+cur.execute("CREATE USER analyst WITH PASSWORD 'def456'")
|
|
|
|
+
|
|
|
|
+# Reconnect to ihw database.
|
|
|
|
+conn = psycopg2.connect(dbname='ihw', user='postgres')
|
|
|
|
+conn.autocommit = True
|
|
|
|
+cur = conn.cursor()
|
|
|
|
+
|
|
|
|
+# Create the table.
|
|
|
|
+cur.execute(
|
|
|
|
+ """
|
|
|
|
+ CREATE TABLE hurricanes (
|
|
|
|
+ fid INTEGER PRIMARY KEY,
|
|
|
|
+ recorded_at TIMESTAMP,
|
|
|
|
+ btid INTEGER,
|
|
|
|
+ name VARCHAR(10),
|
|
|
|
+ lat DECIMAL(4, 1),
|
|
|
|
+ long DECIMAL(4, 1),
|
|
|
|
+ wind_kts SMALLINT,
|
|
|
|
+ pressure INTEGER,
|
|
|
|
+ category VARCHAR(2),
|
|
|
|
+ basin VARCHAR(16),
|
|
|
|
+ shape_length DECIMAL(8, 6)
|
|
|
|
+ )
|
|
|
|
+ """
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+# Manage privileges.
|
|
|
|
+cur.execute("REVOKE ALL ON hurricanes FROM production")
|
|
|
|
+cur.execute("REVOKE ALL ON hurricanes FROM analyst")
|
|
|
|
+cur.execute("GRANT SELECT, INSERT, UPDATE ON hurricanes TO production")
|
|
|
|
+cur.execute("GRANT SELECT ON hurricanes TO analyst")
|
|
|
|
+conn.close()
|
|
|
|
+
|
|
|
|
+# Reconnect with production user.
|
|
|
|
+conn = psycopg2.connect(dbname='ihw', user='production', password='abc123')
|
|
|
|
+cur = conn.cursor()
|
|
|
|
+conn.autocommit = True
|
|
|
|
+
|
|
|
|
+# Insert the data.
|
|
|
|
+response = request.urlopen('https://dq-content.s3.amazonaws.com/251/storm_data.csv')
|
|
|
|
+reader = csv.reader(io.TextIOWrapper(response))
|
|
|
|
+# Skip the header.
|
|
|
|
+_ = next(reader)
|
|
|
|
+rows = []
|
|
|
|
+for line in reader:
|
|
|
|
+ recorded_at = datetime(int(line[1]), int(line[2]), int(line[3]), hour=int(line[4][:2]), minute=int(line[4][2:-1]))
|
|
|
|
+
|
|
|
|
+ new_line = [line[0], recorded_at] + line[5:]
|
|
|
|
+ rows.append(
|
|
|
|
+ cur.mogrify(
|
|
|
|
+ "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
|
|
|
|
+ new_line
|
|
|
|
+ ).decode('utf-8')
|
|
|
|
+ )
|
|
|
|
+cur.execute('INSERT INTO hurricanes VALUES ' + ",".join(rows))
|