# Esercizio 3 dicembre
# Testo nel materiale didattico di SIDBMS - STMM


# prima di tutto si devono importare le librerie.
import csv
import mysql.connector
# poi apriamo il csv e carichiamo tutti il contenuto nel file.
# il quotechar è la " che nel file csv indica le sringhe.
with open("botsol_data.csv",encoding="utf8") as fileAperto:
    miocsv = csv.reader(fileAperto,quotechar="\"",
                        delimiter=",")
    daticsv=list(miocsv)

# ora imposto la stringa contenente l'istruzione SQL di creazione
# della tabella.
# occorre specificare il tipo di dato in base al contenuto del csv.
# Attenzione, se vado a capo con lo \ non posso aggiungere nessun
# carattere dopo lo \.
tableCreationString="create table if not exists hotelSulcis(" \
                    "id integer," \
                    "Name varchar(100) not null," \
                    "Full_Address varchar(100)," \
                    "Website varchar(100)," \
                    "Plus_Code varchar(100)," \
                    "Rating decimal(2,1)," \
                    "Reviews integer," \
                    "primary key (id))"


# L'attributo Rating è un decimal.
# decimal(n,m) indica che i valori validi hanno un totale di n valori dei quali m
# sono decimali. Ad esempio: decimal(6,4) indica che i numeri hanno 2 cifre intere
# e 4 decimali come 12.5621. decimal(3,1) indica numeri con 3 cifre intere e un
# decimale come 874.3

# gli attribui creati corrispondono agli elementi dell'header del csv che ci
# interessano:
#"id", 'Name', 'Full_Address', 'Website', 'Plus_Code', 'Rating', 'Reviews'


# Ora ci connettiamo al database e creiamo il cursore.
connessione =  mysql.connector.connect(user="andrea",password="mysql")
cursore=connessione.cursor()

# creaiamo il database
cursore.execute("create database if not exists sulcis")
# e lo usiamo.
cursore.execute("use sulcis")
# Ora creiamo la tabella
cursore.execute(tableCreationString)

# prepariamo la stringa per l'istruzione SQL di inserimento
stringaInserimento = "insert into hotelSulcis values ({}, {}, {}, {}, {}, {}, {})"

# riformattazione ed inserimento dei dati
for d in daticsv[2:]:
    for i in range(len(d)):
        # sostituisco doppi apici con il singolo apice
        d[i]=d[i].replace('"',"'")
        # se l'elemento è stringa vuota lo devo sostituire con la parola NULL di SQL
        if d[i] == "":
            d[i] = "NULL"

        # Ora, se non è vuota e corrisponde ai varchar della
        # tabella devo aggiungere le virgolette al testo.
        # esempio: nel website devo ottenere "locandarosella.it"
        # senza le virgolette SQL non capisce che si tratta di una
        # stringa.
        else:
            if 0<i<5:
                d[i] = '"'+d[i]+'"'
    # infine devo togliere la virgola che botsol mette come separatore delle migliaia.
    d[6]=d[6].replace(',',"")
    # Ora si può comporre la stringa completa dell'istruzione SQL.
    # Se si vuole visualizzare la stringa si può togliere il commento alla print seguente.
    inserisci = stringaInserimento.format(d[0], d[1], d[2], d[3], d[4], d[5], d[6])
    #print(inserisci)

    # eseguiamo le operazioni
    cursore.execute(inserisci)
# rendiamo effettive le modifiche al database con il commit.
connessione.commit()
# Infine chiudiamo il corsore e la connessione
cursore.close()
connessione.close()


