Esse domingo, estava me preparando para postar aqui no site meu primeiro video-tutorial sobre relatórios com o ireport 3.5.3, quando tive que enfrentar um pequeno empasse.
O script para inserção de registros no banco de dados (PostgreSQL) que eu estava preparando estava com um pequeno problema. As datas estavam num formato inválido “DD MM YYYY”:
INSERT INTO organization VALUES ('AL', 'Arab League', 'Cairo', 'ET', 'El Qahira (munic.)', '22 03 1945'); INSERT INTO organization VALUES ('AG', 'Andean Group', 'Lima', 'PE', 'Lima', '26 05 1969'); INSERT INTO organization VALUES ('C', 'Commonwealth', 'London', 'GB', 'Greater London', NULL); INSERT INTO organization VALUES ('NAM','Nonaligned Movement', 'Jakarta', 'RI', 'Indonesia', '01 09 1961'); |
Notem que, para o banco de dados aceitar esses INSERTs, a data deveria estar no formato “YYYY-MM-DD”.
Eu poderia muito bem ter arrumado as datas na mão, claro, mas eram mais de 150 linhas, e eu demoraria muito fazendo isso…
Foi então, que, tive a idéia de criar um script em Python (sim, tenho dons de python, rs) para realizar a correção dos meus INSERTs.
Peguei todas as instruções de INSERT, e coloquei-as dentro de um arquivo “txt”, chamado “inserts.txt“.
Após rodar o script python, é gerado o arquivo “inserts_novo.txt“, com todas as instruções sql corrigidas, como num passe de mágica.
INSERT INTO organization VALUES ('AL', 'Arab League', 'Cairo', 'ET', 'El Qahira (munic.)', '1945-03-22'); INSERT INTO organization VALUES ('AG', 'Andean Group', 'Lima', 'PE', 'Lima', '1969-05-26'); INSERT INTO organization VALUES ('C', 'Commonwealth', 'London', 'GB', 'Greater London', NULL); INSERT INTO organization VALUES ('NAM','Nonaligned Movement', 'Jakarta', 'RI', 'Indonesia', '1961-09-01'); |
Segue então o código. Importante notar que, como foi um código corriqueiro, não me preocupei em fazer validações, não havia necessidade.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | insert = "INSERT INTO organization VALUES " arquivo = open("inserts.txt", "r") # Arquivo de INSERTS com data incorreta novo_arquivo = open("inserts_novo.txt", "w") # Arquivo que receberá os INSERTS corretos for linha in arquivo: tupla = linha[linha.find("("):linha.rfind(")")+1] # Pega a parte que vem após o VALUES tupla = tupla.replace("NULL", "None") # Troca os valores NULL por None. OBS: Não existe NULL no Python, no lugar dele, existe o None lista = list(eval(tupla)) # Transforma string numa tuple, e logo em seguida numa list. Isso é necessário, dado que objetos tuple são imutáveis. if lista[-1] != None: dia, mes, ano = lista[-1].split(" ") # Quebra o elemento onde está a data em mais 3 elementos, e já atribui eles em variáveis lista[-1] = "%s-%s-%s" % (ano, mes, dia) # Troca a data antiga pela data no formato correto tupla = tuple(lista) # Tranforma a list numa tuple novamente nova_query = insert + str(tupla) + "\n" # Recria o INSERT nova_query = nova_query.replace("None", "NULL") # Troca novamente os valores None por NULL novo_arquivo.write(nova_query) # Escreve o INSERT no arquivo_novo.txt novo_arquivo.close() # Salva as informações escritas e fecha o arquivo arquivo.close() # Fecha o arquivo |
Apenas a título de curiosidade para aqueles que não conhecem essa linguagem fantástica, o código acima pode ainda ser escrito de outra forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | insert = "INSERT INTO organization VALUES " arquivo = open("inserts_novo_old.sql", "r") novo_arquivo = open("inserts_novo.sql", "w") for linha in arquivo: lista = list(eval(linha[linha.find("("):linha.rfind(")")+1].replace("NULL", "None"))) if lista[-1] != None: dia, mes, ano = lista[-1].split(" ") lista[-1] = "%s %s %s" % (ano, mes, dia) novo_arquivo.write((insert + str(tuple(lista)) + "\n").replace("None", "NULL")) novo_arquivo.close() arquivo.close() |
Ainda dava pra diminuir, porém não estou com inspiração pra fazer isso… rs
Observação: Esse código não levou nem 15 minutos para ficar pronto e funcionar. Isso porque nem sou um mestre em python, rs… Os gurus da Python Brasil talvez levassem apenas uns 5 minutos… rs . Se eu fosse alterar as datas na mão, talvez levasse um pouco mais de 1 hora…
Bom, fica aí a dica, aprendam Python, mesmo que o básico, e verá o quanto pode se beneficiar disso. Não é a toa que dizem que Python torna o desenvolvimento mais rápido e produtivo.
Quem tiver interesse em aprender, pode acessar o site da Python Brasil, ou pesquisar pela internet mesmo, que existe muito material bom…
Links interessantes:
http://www.python.org/ (Site Oficial do Python – Inglês)
http://www.python.org.br
http://diveintopython.org/
http://www.async.com.br/projects/python/pnp/