Consultar MySQL/PostgreSQL e salvar em CSV

O script em Python a seguir permite consultar um banco de dados MySQL e gravar localmente um arquivo contendo a saída da exceção da query em um arquivo separado por vírgulas (CSV). Além do Python em si, é necessária a instalação do módulo MySQLdb, o que pode ser feito através do comando “sudo apt-get install python-mysqldb”.

# -*- coding: utf-8 -*-
# Script para consultar BD e gravar CSV

import os
import sys
import MySQLdb

# Período de busca
ini = "2017-01-01"
fim = "2017-12-31"

estados = ['AC','AL','AM','AP','BA','CE','DF','ES','GO','MA','MG','MS','MT','PA','PB','PE','PI','PR','RJ','RN','RO','RR','RS','SC','SE','SP','TO']

# Apagar arquivo de destino e gravar cabeçalho
with open('totais.csv', 'wb') as f:
	f.write('estado,cidade,total\n')

for uf in estados:
	print uf
	# Montar query
	query = "SELECT estado,cidade,sum(vendas) as raios from `" + uf + "` WHERE data BETWEEN '" + ini + "' AND '" + fim + "' GROUP BY cidade;"
	#print query
	# Fazer consulta ao BD
	conn = MySQLdb.connect(host="IP_DO_BD",port=3306,user="USUARIO_DO_BD",passwd="SENHA_DO_USUARIO",db="NOME_DA_BASE")
	cursor = conn.cursor()
	cursor.execute(query)
	results = cursor.fetchall()
	# Fechar ponteiro e conexão
	cursor.close()
	conn.close()
	#for items in results:
	#    print items[0],items[1],items[2]
	# Gravar arquivo com dados
	with open('totais.csv', 'a') as f:
		for line in results:
			f.write("%s,%s,%d\n" %(line[0],line[1],int(line[2])))
	#sys.exit("fim de teste")

A query usada serve para pegar o total de uma variável somando por cidade. Caso dê um erro do tipo “Host ‘SEU_IP’ is not allowed to connect to this MySQL server”, será preciso criar um usuário no MySQL do servidor e permitir o acesso à base de dados – veja mais no post sobre Banco de dados MySQL.

Caso seja um banco em PostgreSQL, o módulo a ser usado é o Psycopg. O script recebe um argumento de identificação qualquer (tipo) e o nome da tabela (table_name), monta a query para ser executada e grava um arquivo com a tabela extraída.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys
import psycopg2
import psycopg2.extras

# Receber tipo e nome da tabela como argumento
tipo = sys.argv[1]
table_name = sys.argv[2]
path = os.path.dirname(os.path.realpath(__file__))

print "Baixando dados de " + tipo

# Montar query para extrair todas as colunas desde 2001-JAN
query = "SELECT * FROM %s WHERE yr >= 2001 ORDER BY yr,mon;" % (table_name)
#print(query)
#sys.exit("fim de teste")

# Executar query
conn = psycopg2.connect(host = "IP_DO_BD", database = "NOME_DA_BASE", user="USUARIO_DO_BD")
cursor = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
cursor.execute(query)
tabela = cursor.fetchall()
# Fechar ponteiro e conexão
cursor.close()
conn.close()
#print(tabela)

# Gravar arquivo com dados
with open('%s/dados/hist_%s.csv' % (path, tipo), 'wb') as f:
	f.write('data,valor\n')
	for linha in tabela:
		# Escrever linha por linha no formato YYYY-MM-01,VALOR
		f.write("%s-%02d-01,%s\n" %(linha[0],int(linha[1]),linha[2]))

A query executada retorna todas as colunas cujas linhas possuam ano maior ou igual a 2001. Ao gravar o arquivo de saída, linha por linha, o valor de mês é acertado para sempre ter dois dígitos (com zero à esquerda quando for o caso). Veja mais sobre PostgreSQL clicando no link.