Example #1
0
    def _get_candidato_id(self, cpf, titulo_eleitoral):
        query = ("SELECT id FROM candidato WHERE "
                 "cpf = %(cpf)s AND titulo_eleitoral = %(titulo_eleitoral)s")
        parametros = {
            'cpf': parsers.parse_cpf(cpf),
            'titulo_eleitoral':
            parsers.parse_titulo_eleitoral(titulo_eleitoral)
        }
        cursor = self.cnx.cursor(buffered=True)
        try:
            cursor.execute(query, parametros)
        except Exception as e:
            cursor.close()
            self._handle_exception(exception=e, row=query)
        resultados = cursor.fetchall()
        cursor.close()

        return resultados[0][0] if len(resultados) > 0 else 0
def _get_candidato_id(cpf, titulo_eleitoral, cnx, cursor):
    # Verificar se o candidato já está cadastrado
    query = ("SELECT id FROM candidato WHERE "
             "cpf = %(cpf)s AND titulo_eleitoral = %(titulo_eleitoral)s")
    parametros = {
        'cpf': parsers.parse_cpf(cpf),
        'titulo_eleitoral': parsers.parse_titulo_eleitoral(titulo_eleitoral)
    }

    try:
        cursor.execute(query, parametros)
    except:
        print(query)
        cursor.close()
        cnx.close()
        raise

    resultados = cursor.fetchall()
    candidato_id = resultados[0][0] if len(resultados) > 0 else 0

    return candidato_id
Example #3
0
    def migrar(self, ano):
        self.cnx = mysql.connect(**self.BD_CONFIG)

        tempo_inicio_ano = time.time()

        arquivos = self.PREFIXO_ARQUIVO_CANDIDATURAS + str(ano) + '*.txt'
        pathes = os.path.join(self.DIRETORIO_TEMPORARIO, arquivos)
        arquivos_do_ano = sorted(glob.glob(pathes))

        for arquivo_estado in arquivos_do_ano:
            tempo_inicio_estado = time.time()
            print('Iniciando {}'.format(arquivo_estado))

            df_estado = pd.read_csv(arquivo_estado,
                                    sep=';',
                                    header=None,
                                    dtype=np.str,
                                    names=headers.get_header(ano),
                                    encoding='iso-8859-1')

            candidaturas = (
                df_estado[self._get_colunas_candidatura(ano)].rename(
                    columns=self._get_map_colunas_candidatura(ano)))

            total_candidaturas = candidaturas.shape[0]
            print('Total de candidaturas em {}: {}'.format(
                ano, total_candidaturas))

            for candidatura in candidaturas.itertuples():
                cursor = self.cnx.cursor(buffered=True)

                estado_id = self._get_estado_id(
                    sigla_estado=candidatura.sigla_estado_nascimento)
                cidade_id = None if (not estado_id) else self._get_cidade_id(
                    cidade=candidatura.cidade_nascimento, estado_id=estado_id)
                email = parsers.parse_email(candidatura.email) if (
                    'email' in candidaturas.columns) else None
                id_candidato = self._get_candidato_id(
                    cpf=candidatura.cpf,
                    titulo_eleitoral=candidatura.titulo_eleitoral)

                if (id_candidato == 0):
                    # Cadastrar candidato
                    query = (
                        "INSERT INTO candidato "
                        "(nome, data_nascimento, cpf, titulo_eleitoral, email, cidade_id, ocupacao_id, nacionalidade_id, grau_instrucao_id) "
                        "VALUES (%(nome)s, %(data_nascimento)s, %(cpf)s, %(titulo_eleitoral)s, %(email)s, %(cidade_id)s, %(ocupacao)s, %(nacionalidade)s, %(grau_instrucao)s)"
                    )
                    atributos = {
                        'nome':
                        parsers.parse_nome(candidatura.nome),
                        'data_nascimento':
                        parsers.parse_data(candidatura.data_nascimento),
                        'cpf':
                        parsers.parse_cpf(candidatura.cpf),
                        'titulo_eleitoral':
                        parsers.parse_titulo_eleitoral(
                            candidatura.titulo_eleitoral),
                        'email':
                        email,
                        'cidade_id':
                        cidade_id,
                        'ocupacao':
                        parsers.parse_ocupacao(candidatura.ocupacao),
                        'nacionalidade':
                        parsers.parse_nacionalidade(candidatura.nacionalidade),
                        'grau_instrucao':
                        parsers.parse_grau_instrucao(
                            candidatura.grau_instrucao)
                    }
                else:
                    # Atualizar dados do candidato
                    query = ("UPDATE candidato "
                             "SET "
                             "nome = %(nome)s, "
                             "data_nascimento = %(data_nascimento)s, "
                             "email = %(email)s, "
                             "cidade_id = %(cidade_id)s, "
                             "ocupacao_id = %(ocupacao)s, "
                             "nacionalidade_id = %(nacionalidade)s, "
                             "grau_instrucao_id = %(grau_instrucao)s "
                             "WHERE id = %(candidato_id)s")
                    atributos = {
                        'nome':
                        parsers.parse_nome(candidatura.nome),
                        'data_nascimento':
                        parsers.parse_data(candidatura.data_nascimento),
                        'email':
                        email,
                        'cidade_id':
                        cidade_id,
                        'ocupacao':
                        parsers.parse_ocupacao(candidatura.ocupacao),
                        'nacionalidade':
                        parsers.parse_nacionalidade(candidatura.nacionalidade),
                        'grau_instrucao':
                        parsers.parse_grau_instrucao(
                            candidatura.grau_instrucao),
                        'candidato_id':
                        id_candidato
                    }

                try:
                    cursor.execute(query, atributos)
                except Exception as e:
                    cursor.close()
                    self._handle_exception(exception=e, row=candidatura)

                # Cadastrar candidatura
                candidato_id = cursor.lastrowid if (id_candidato
                                                    == 0) else id_candidato
                eleicao_id = self._get_eleicao_id(
                    ano=candidatura.ano,
                    descricao=candidatura.descricao_eleicao)
                estado_id = self._get_estado_id(
                    sigla_estado=candidatura.sigla_estado_eleicao)
                cidade_id = None if (not estado_id) else self._get_cidade_id(
                    cidade=candidatura.cidade_eleicao,
                    sigla_ue=candidatura.sigla_cidade_eleicao,
                    estado_id=estado_id)
                partido_id = self._get_partido_id(numero=candidatura.partido)

                query = (
                    "INSERT INTO candidatura "
                    "(eleicao_id, turno, candidato_id, cidade_id, estado_id, numero_candidato, nome_urna, partido_id, legenda_nome, legenda_composicao, cargo_id, despesa_maxima, situacao_candidatura_id, resultado_candidatura_id) "
                    "VALUES (%(eleicao)s, %(turno)s, %(candidato)s, %(cidade)s, %(estado)s, %(numero_candidato)s, %(nome_urna)s, %(partido)s, %(legenda_nome)s, %(legenda_composicao)s, %(cargo)s, %(despesa_maxima)s, %(situacao_candidatura)s, %(resultado_candidatura)s)"
                )
                atributos = {
                    'eleicao':
                    eleicao_id,
                    'turno':
                    parsers.parse_turno(candidatura.turno),
                    'candidato':
                    candidato_id,
                    'cidade':
                    cidade_id,
                    'estado':
                    estado_id,
                    'numero_candidato':
                    parsers.parse_numero_candidato(
                        candidatura.numero_candidato),
                    'nome_urna':
                    parsers.parse_nome_urna(candidatura.nome_urna),
                    'partido':
                    partido_id,
                    'legenda_nome':
                    parsers.parse_legenda(candidatura.legenda_nome),
                    'legenda_composicao':
                    parsers.parse_legenda(candidatura.legenda_composicao),
                    'cargo':
                    parsers.parse_cargo(candidatura.cargo),
                    'despesa_maxima':
                    parsers.parse_despesa_maxima(candidatura.despesa_maxima),
                    'situacao_candidatura':
                    parsers.parse_situacao_candidatura(
                        candidatura.situacao_candidatura),
                    'resultado_candidatura':
                    parsers.parse_resultado_candidatura(
                        candidatura.resultado_candidatura)
                }

                try:
                    cursor.execute(query, atributos)
                    self.cnx.commit()
                except:
                    cursor.close()
                    self._handle_exception(exception=e, row=candidatura)

                sys.stdout.write('\r{} de {}'.format((candidatura[0] + 1),
                                                     total_candidaturas))
                sys.stdout.flush()

                cursor.close()

            sys.stdout.write('\n')
            tempo_final_estado = time.time()
            print('Tempo total desse estado: {:.2f}s \n'.format(
                (tempo_final_estado - tempo_inicio_estado)))

        tempo_final_ano = time.time()
        print('Tempo total em {}: {:.2f}s \n'.format(
            ano, (tempo_final_ano - tempo_inicio_ano)))

        self.cnx.close()
def migrar_dados_candidato(ano):
    tempo_inicio_ano = time.time()

    arquivos = PREFIXO_ARQUIVO_CANDIDATURAS + str(ano) + '*.txt'
    pathes = os.path.join(DIRETORIO_TEMPORARIO, arquivos)
    arquivos_do_ano = sorted(glob.glob(pathes))

    for arquivo_estado in arquivos_do_ano:
        tempo_inicio_estado = time.time()
        print('Iniciando {}'.format(arquivo_estado))

        df_estado = pd.read_csv(
            arquivo_estado,
            sep = ';',
            header = None,
            dtype = np.str,
            names = headers.get_header(ano),
            encoding = 'iso-8859-1'
        )

        candidatos = (
            df_estado[get_colunas_candidato(ano)]
            .drop_duplicates(['CPF_CANDIDATO', 'NUM_TITULO_ELEITORAL_CANDIDATO'], keep='last')
            .rename(columns = get_map_colunas_candidato(ano))
        )

        total_candidatos = candidatos.shape[0]
        print('Total de candidatos em {}: {}'.format(ano, total_candidatos))


        cnx = mysql.connect(**BD_CONFIG)
        cursor = cnx.cursor(buffered=True)

        for candidato in candidatos.itertuples():
            candidato_id = _get_candidato_id(
                cpf=candidato.cpf,
                titulo_eleitoral=candidato.titulo_eleitoral,
                cnx=cnx,
                cursor=cursor)

            cidade_id = _get_cidade_id(
                cidade=candidato.cidade,
                sigla_estado=candidato.estado,
                cnx=cnx,
                cursor=cursor)

            email = parsers.parse_email(candidato.email) if ('email' in candidatos.columns) else None

            if (candidato_id == 0):
                # Cadastrar candidato
                query = ("INSERT INTO candidato "
                               "(nome, data_nascimento, cpf, titulo_eleitoral, email, cidade_id, ocupacao_id, nacionalidade_id, grau_instrucao_id) "
                               "VALUES (%(nome)s, %(data_nascimento)s, %(cpf)s, %(titulo_eleitoral)s, %(email)s, %(cidade_id)s, %(ocupacao)s, %(nacionalidade)s, %(grau_instrucao)s)")
                atributos = {
                    'nome': parsers.parse_nome(candidato.nome),
                    'data_nascimento': parsers.parse_data(candidato.data_nascimento),
                    'cpf': parsers.parse_cpf(candidato.cpf),
                    'titulo_eleitoral': parsers.parse_titulo_eleitoral(candidato.titulo_eleitoral),
                    'email': email,
                    'cidade_id': cidade_id,
                    'ocupacao': parsers.parse_ocupacao(candidato.ocupacao),
                    'nacionalidade': parsers.parse_nacionalidade(candidato.nacionalidade),
                    'grau_instrucao': parsers.parse_grau_instrucao(candidato.grau_instrucao)
                }
            else:
                # Atualizar dados do candidato
                query = (
                    "UPDATE candidato "
                    "SET "
                    "nome = %(nome)s, "
                    "data_nascimento = %(data_nascimento)s, "
                    "email = %(email)s, "
                    "cidade_id = %(cidade_id)s, "
                    "ocupacao_id = %(ocupacao)s, "
                    "nacionalidade_id = %(nacionalidade)s, "
                    "grau_instrucao_id = %(grau_instrucao)s "
                    "WHERE id = %(candidato_id)s"
                )
                atributos = {
                    'nome': parsers.parse_nome(candidato.nome),
                    'data_nascimento': parsers.parse_data(candidato.data_nascimento),
                    'email': email,
                    'cidade_id': cidade_id,
                    'ocupacao': parsers.parse_ocupacao(candidato.ocupacao),
                    'nacionalidade': parsers.parse_nacionalidade(candidato.nacionalidade),
                    'grau_instrucao': parsers.parse_grau_instrucao(candidato.grau_instrucao),
                    'candidato_id': candidato_id
                }

            try:
                cursor.execute(query, atributos)
                cnx.commit()
            except:
                print(candidato)
                cursor.close()
                cnx.close()
                raise

            sys.stdout.write('\r{} de {}'.format(candidato[0], total_candidatos))
            sys.stdout.flush()

        cursor.close()
        cnx.close()

        sys.stdout.write('\n')
        tempo_final_estado = time.time()
        print('Tempo total desse estado: {:.2f}s \n'.format((tempo_final_estado - tempo_inicio_estado)))

    tempo_final_ano = time.time()
    print('Tempo total em {}: {:.2f}s \n'.format(ano, (tempo_final_ano - tempo_inicio_ano)))