utils_sql.py 2.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
# -*- coding: utf-8 -*-
"""
Created on Tue Feb  2 11:07:37 2021

@author: ctb
"""

import mysql.connector
import pandas as pd

def generate_db_connection(ip, port, user, password, db_name):
    db_conn = mysql.connector.connect(
         host=ip,
         port=port,
         user=user,
         password=password,
         database=db_name,
         auth_plugin='mysql_native_password'
    )
    db_cursor = db_conn.cursor()
    
    return {"cnx": db_conn, "cursor": db_cursor}

def get_columns_from_table(db_mngr, table_name):
    db_mngr["db_crs"].execute("show columns from "+table_name)
    semantic_annotation_table_cols = db_mngr["db_crs"].fetchall()
    col_list = []
    for x in semantic_annotation_table_cols:
        col_list.append(x[0])
        
    return col_list

# Genera un dataframe con el contenido de la tabla indicada en 'table_name'.
# Si se pasan numeros enteros en los campos opcionales 'batch_size' y 'offset', se devolvera el dataframe
# correspondiente a un numero de 'batch_size' filas de la tabla, desde la fila indicada por 'offset'.
def compose_dataframe_from_query(db_mngr, table_name, batch_size = None, offset = None, where_clause = None, join_clause = None):
    if(join_clause is not None):
        query = "Select u.document_id, u.ehr,  u.concept, d.subcategory, u.begin, u.end from " + table_name + " u inner join document d on d.ID = u.document_id";
    else:
        query = "Select document_id, ehr, sentence, sentence_id, concept, begin, end from " + table_name

    if where_clause is not None:
        query = query + " where " + where_clause

    #if group_by is not None:
    #    query = query + " group by " + group_by

    if batch_size is not None and offset is not None:
        query = query + " limit " + str(batch_size) + " offset " + str(offset)
    
    db_mngr["db_crs"].execute(query)
    result = db_mngr["db_crs"].fetchall()


    if(join_clause is not None):
        table_cols = ["document_id", "ehr", "concept", "subcategory", "begin", "end"]
    else:
        table_cols = ["document_id", "ehr", "sentence", "sentence_id", "concept", "begin", "end"]
        
    if len(result) > 0:
        result = pd.DataFrame(result)
        result.columns = table_cols
    else:
        result = pd.DataFrame(columns=table_cols)        
        
    return result