12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 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))
|