Skip to content
Snippets Groups Projects
ExportToDatabase.py 2.94 KiB
Newer Older
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 14 13:43:45 2021

export the stationlist to database

@author: geopeter
"""
import psycopg2
import psycopg2.extras
from psycopg2 import sql
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

stationGPD = None


# Connect to DB "postgres" to check for database "temperatures_berteld_morstein"
def check_for_db_existence():
    print("Checking for database existence")
    with psycopg2.connect(database='postgres', user='postgres', password='postgres', host='localhost', port=5432) as connection:
        with connection.cursor() as cursor:
            cursor.execute("SELECT datname FROM pg_database WHERE datname LIKE 'temperatures_berteld_morstein';")

            try:
                db_exists = cursor.fetchall()[0]
                print('DB existing')

            except IndexError:  # DB temperatures_berteld_morstein doesn't exist
                print('DB not existing')
                try:
                    create_db(connection, cursor)
                    create_table()
                    print('Successfully created database and table')
                except (Exception, psycopg2.DatabaseError) as error:
                    print(error)


# Use existing connection to DB "postgres" to create DB "temperatures_berteld_morstein"
def create_db(connection, cursor):
    connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)  # Needs to be in AUTOCOMMIT mode for creating database
    create_db_query = sql.SQL("CREATE DATABASE temperatures_berteld_morstein;")
    print(create_db_query)
    cursor.execute(create_db_query)


# Connect to DB "temperatures_berteld_morstein" to create table "temperatures"
def create_table():
    with psycopg2.connect(database='temperatures_berteld_morstein', user='postgres', password='postgres', host='localhost', port=5432) as connection:
        with connection.cursor() as cursor:
            query = sql.SQL("CREATE TABLE temperatures (id INTEGER, lon NUMERIC, lat NUMERIC, country TEXT);")
            print(query)
            cursor.execute(query)


def insert_data(stationList):
    with psycopg2.connect(database='temperatures_berteld_morstein', user='postgres', password='postgres', host='localhost', port=5432) as connection:
        with connection.cursor() as cursor:

            if len(stationList) > 0:
                df_columns = list(stationList)
                # create (col1,col2,...)
                columns = ",".join(df_columns)

                # create VALUES('%s', '%s",...) one '%s' per column
                values = "VALUES({})".format(",".join(["%s" for _ in df_columns]))

                # create INSERT INTO table (columns) VALUES('%s',...)
                insert_stmt = "INSERT INTO {} ({}) {}".format('temperatures', columns, values)

                psycopg2.extras.execute_batch(cursor, insert_stmt, stationList.values)


def export(stationList):
    check_for_db_existence()
    insert_data(stationList)

    # return stationList