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/