Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 22 additions & 8 deletions import/import_openclimate_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from schema import tables, pkeys
import logging


def import_row(curs, table, pkey, row):

# TODO: check that these always return in order
Expand Down Expand Up @@ -50,13 +51,15 @@ def import_row(curs, table, pkey, row):

curs.execute(qry, vals)


def import_table(curs, table, pkey, path):

with path.open() as f:
data = csv.DictReader(f)
for row in data:
import_row(curs, table, pkey, row)


def delete_row(curs, table, pkey, row):

vals = list(map(lambda v: None if v == '' else v, row.values()))
Expand All @@ -68,37 +71,48 @@ def delete_row(curs, table, pkey, row):

curs.execute(qry, vals)


def delete_from_table(curs, table, pkey, path):
with path.open() as f:
data = csv.DictReader(f)
for row in data:
delete_row(curs, table, pkey, row)


def import_openclimate_data(dir, host, dbname, user, password):

with psycopg2.connect(dbname=dbname, user=user, password=password, host=host) as conn:

with conn.cursor() as curs:

for table in tables:
p = Path(dir + "/" + table + ".csv")
table_file = f'{table}.csv'
p = Path(dir) / table_file
if p.is_file():
import_table(curs, table, pkeys[table], p)

# For deletions, we work in reverse order!
for table in reversed(tables):
p = Path(dir + "/" + table + ".delete.csv")
table_file_delete = f'{table}.delete.csv'
p = Path(dir) / table_file_delete
if p.is_file():
delete_from_table(curs, table, pkeys[table], p)


if __name__ == "__main__":
import argparse
import os
parser = argparse.ArgumentParser()
parser.add_argument('--dbname', help='database name', default=os.environ.get('OPENCLIMATE_DATABASE'))
parser.add_argument('--user', help='database user', default=os.environ.get('OPENCLIMATE_USER'))
parser.add_argument('--password', help='database password', default=os.environ.get('OPENCLIMATE_PASSWORD'))
parser.add_argument('--host', help='database host', default=os.environ.get('OPENCLIMATE_HOST'))
parser.add_argument('dir', help='directory with CSV files for OpenClimate tables')
parser.add_argument('--dbname', help='database name',
default=os.environ.get('OPENCLIMATE_DATABASE'))
parser.add_argument('--user', help='database user',
default=os.environ.get('OPENCLIMATE_USER'))
parser.add_argument('--password', help='database password',
default=os.environ.get('OPENCLIMATE_PASSWORD'))
parser.add_argument('--host', help='database host',
default=os.environ.get('OPENCLIMATE_HOST'))
parser.add_argument(
'dir', help='directory with CSV files for OpenClimate tables')
args = parser.parse_args()
import_openclimate_data(args.dir, args.host, args.dbname, args.user, args.password)
import_openclimate_data(args.dir, args.host,
args.dbname, args.user, args.password)