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
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)))