Como migrar suas Stored Procedures no ambiente de teste
11/06/07
Normalmente, evito utilizar Stored Procedures e Functions até onde posso, mas no Spesa, não foi possível, devido uma quantidade de consultas "avançadas" que são feitas. Se não as utilizasse, a repetição de código seria absurdamente grande e, por conseguinte, seria impossível de se fazer eventuais modificações. Como estou refatorando o código do Spesa e escrevendo testes para cada item do sistema, caí em um problema um pouco incômodo na hora da migração.
Não sei se você sabe, mas toda vez que você quer sincronizar o seu banco de testes com o de desenvolvimento, basta executar o comando rake db:test:prepare. O grande problema deste comando é que ele não leva em consideração os arquivos de migração, mas sim o arquivo schema.rb, que não adiciona queries executadas através do método execute. Para corrigir isto, basta executar o comando rake db:migrate RAILS_ENV="test".
Update: depois de fazer alguns testes, vi que as stored procedures continuavam a serem excluídas. O único jeito foi estender o ActiveRecord para ele fazer o dump das funções e salvá-las no arquivo schema.rb. Basta adicionar o código abaixo no arquivo environment.rb.
module ActiveRecord
class SchemaDumper
def dump(stream)
header(stream)
tables(stream)
functions(stream)
trailer(stream)
stream
end
private
def functions(stream)
result = @connection.execute <<QUERY
SELECT
ROUTINE_NAME AS name
FROM
INFORMATION_SCHEMA.ROUTINES
WHERE
ROUTINE_TYPE='FUNCTION' AND
ROUTINE_SCHEMA='#{@connection.current_database}'
QUERY
result.each do |row|
stream = function(row[0], stream)
end
end
def function(name, stream)
result = @connection.execute "SHOW CREATE FUNCTION #{name}"
fields = result.fetch_hash
func = fields['Create Function'].gsub(/CREATE DEFINER.*? FUNCTION/, "CREATE FUNCTION")
stream.puts <<FUNCTION
execute <<QUERY
#{func}
QUERY
FUNCTION
stream
end
end
end - Permalink
- Trackback
- Comentários (3)
- Ao som de: The Get Up Kids – Conversation
Gerenciador MySQL para Linux
26/03/07
Quem usa/usou Windows e tinha que mexer com banco de dados MySQL provavelmente usou o MySQL-Front, descontinuado por pressão da própria MySQL. Hoje, uma alternativa é o SQLyog.
A verdade é que sempre quis um programa assim para Linux. Aquele gerenciador — MySQL Administrator — criado pela MySQL é horrível. Tudo muito complicado de fazer. E não é que procurando por algum outro gerenciador, encontrei o Emma?
Atalhos semelhantes ao falecido MySQL-Front, interface simples de usar, ou seja, exatamente do jeito que eu queria! No Ubuntu, basta rodar o comando abaixo para instalá-lo:
$~ sudo aptitude install emma
Não sei te dizer em qual repositório este pacote está localizado, então, se você não encontrá-lo lembre-se de habilitar os repositórios universe e multiverse.
- Permalink
- Trackback
- Comentários (17)
- Ao som de: Rancid – I Am the One
Migrando de ISO-8859-1 para UTF-8 no Rails
13/03/07
O Spesa foi criado usando a codificação ISO-8859-1, principalmente pelo fato de achar que o Ruby fazia UTF-8 "nas coxas". Como houve uma preocupação muito maior com o lançamento do Rails 1.2, através do mixin "Chars" — embora seja feito no framework e não na linguagem — e estou migrando meu projeto para esta nova versão, resolvi mudar a codificação de ISO para UTF-8.
Migrar o banco de dados foi bem simples, já que o PHPMyAdmin, quando exporta as informações, automaticamente converte para UTF-8. A única coisa que é preciso fazer, é importar os dados também pelo PHPMyAdmin (não consegui fazer direto pelo shell do MySQL).
Outra coisa que você tem que fazer é converter todos os arquivos — classes, templates e controllers — para UTF-8. Mas cuidado: não salve com o BOM. Se você salvar, o Ruby acusará erros de compilação.
Não se esqueça de atualizar seu código caso use funções que manuseiam strings. Veja um exemplo abaixo:
#retornará 15
puts 'João Silvério'.length
#retornará 13
puts 'João Silvério'.chars.length
Daqui para frente, vamos fazer nossos aplicativos com UTF-8. Capisce?
- Permalink
- Trackback
- Comentários (7)
- Ao som de: Waking Ashland – Sing Me to Sleep
