Utilizando o SQLAlchemy no Flask com MySQL

Quando tentei utilizar esta combinação, seguindo justamente o howto do site do Flask, me ocorria um erro depois de um tempo em que a conexão não era utilizada:

SqlAlchemy: SQLError: (OperationalError) (2006, ‘MySQL server has gone away’)

E como resolver isto ? Em vários posts por ai vi o pessoal utilizando-se da configuração “pool_recycle” para deixar a conexão mais tempo no ar, tentando colocar a conexão na sessão, e tudo mais… nada funcionou!

Só consegui resolver isto do modo pessimista, adicionando o seguinte código no database.py:

from sqlalchemy import exc
from sqlalchemy import event
from sqlalchemy.pool import Pool

@event.listens_for(Pool, "checkout")
def ping_connection(dbapi_connection, connection_record, connection_proxy):
    cursor = dbapi_connection.cursor()
    try:
        cursor.execute("SELECT 1")
    except:
        # optional - dispose the whole pool
        # instead of invalidating one at a time
        # connection_proxy._pool.dispose()

        # raise DisconnectionError - pool will try
        # connecting again up to three times before raising.
        raise exc.DisconnectionError()
    cursor.close()

E voialá ! Funcionou !…

Anúncios

Novos rumos: Pyramid

Ontem tive meu primeiro contato real com o Pyramid!

Depois de trabalhar várias vezes com o Django, de conhecer bem ele, suas várias features e tudo mais, acabei precisando de um framework mais flexível para meu projeto que quero desenvolver, e que, não saiu ainda do papel por que em certo ponto do desenvolvimento tudo se tornava massante e trabalhoso.

Mas eu realmente vi uma luz no fim do tunel com o Pyramid. Se mostrou um fw simples, consistente e flexível. Não tive trabalho algum para iniciar um projeto e sair programando algo mais simples, como criar uma outra view além da default, bastou utilizar uma meia-hora e dar uma passada de olho na documentação.

Claro que, eu não fiz nada demais, apenas iniciei o projeto, fiz algumas alterações, tomei conhecimento do ambiente gerado por ele, rodei o ambiente de desenvolvimento, estas coisas. A partir de agora é trabalhar para aprender mais e mais deste frameworks que pelo visto vai me facilitar a vida.

Outra coisa, eu achei muito simples trabalhar com o mongodb juntamente com o Pyramid. Praticamente não necessita de configuração, é só chamar e usar.. hehehe Mas um detalhe que me deixou meio triste foi que não funcionou o projeto com o template para utilizar o Jinja2 como renderer dos templates web. Gosto muito do Jinja2 pelas facilidades, e principalmente pela herança de templates possível, onde você cria uma página com seções definidas e pode criar outras páginas que herdam esta página e imprimem somente nas seções que deseja.. mas o template engine do Pyramid, que veio do Pylons, não é tão mal assim, mas é mais trabalhoso, pois trabalha com umas tags no meio do html, e não me pareceu muito pythônico. Tudo bem !

Bom , é isto por enquanto, depois posto aqui como iniciar um projeto simples com o Pyramid + MongoDB ! Ok !

Abraços !

Livros onlines…

Olá !

Quero parabenizar o pessoal por ter traduzido o livro “A Byte of Python” para português.

Segue o link: http://swaroopch.com/notes/Python_pt-br:Indice

E sei que este blog é especialmente voltado ao Python, mas quero aqui citar também outro belo trabalho de tradução, voltado ao Ruby, “O (comovente) Guia de Ruby do Why”

Segue o link tb: http://why.nomedojogo.com/

3 coisas legais para Python

PyRO – Python Remote Objects – É uma poderosa e avançada tecnologia de objetos distribuídos totalmente escrita em python.

Pytesser – Módulo OCR para Python

Pyrex – Permite você extender o Python criando módulos para a linguagem, com syntaxe Python, que serão compilados para C.

Outros sites de “gincana” de programação

Fica ai então a dica, do amigo leitor Guaracy, de outros dois sites equivalentes ao Project Euler.

São eles: http://rosettacode.orghttp://www.pythonchallenge.com/

O Python Challenge é um pouco diferente na forma de apresentar as questões, pois você tem que resolver uma para depois ter a próxima disponível, além de ser direcionado a programação Python mesmo. Fora isto, aprenderemos muito igualmente aos outros !

Aproveitem !

Cálculo de números primos

Partindo de algumas leituras sobre as regras de números primos, então acabei por criar um pequeno script que gera os números primos de 1 até um limite informado, da forma mais pythônica que consegui.

def eh_primo(numero):
    #Verifica se um numero eh primo ou nao
    return True if sum([ 1 for div in range(2,numero) if numero % div == 0 ]) == 0 else False

def primos(limite):
    #Numeros primos
    numeros = [2] + range(3,limite+1,2)
    primos = []
    for num in numeros:
        if sum([ 1 for div in range(2,num) if num % div == 0 ]) == 0 :
            primos.append(num)
    return primos
    
print primos(100)
print primos(500)
print eh_primo(18)
print eh_primo(19)
print eh_primo(20)
print eh_primo(23)

Explicando:
– Números primos são somente números ímpares e o 2
– Não valida com 1 e o próprio número, pois não necessita
– cria uma lista com o 2 e a partir do 3, somente os ímpares
– verifica se a SOMA dos 1 retornados para cada NÚMERO onde o resto da divisão (%) entre o NÚMERO e cada um dos menores que ele for igual a zero, quer dizer que o número é divisível por outro número além de 1 e ele mesmo.

Olha, não é fácil entender a primeira vista este trecho de código, mas consegui finalmente chegar até um pequeno script sem muitos loops, graças as facilidades do python, com sua List Comprehension e Programação Funcional !

Conseguem melhorar ainda mais este script ?

ProjectEuler#6

Problema proposto:

http://projecteuler.net/index.php?section=problems&id=6

Resolução pythônica:

>>> (sum(xrange(1,101)) ** 2) - (sum([x ** 2 for x in xrange(1,101)]))

Cuidado: aqui tem uma pegadinha do [x]range, a syntaxe dele é: xrange(start,stop,step) .

Mas percebam os resultados

>>> [x for x in xrange(1,10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x for x in xrange(1,11)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 

Ele não retorna o último número, ele PÁRA no último número. Por isto, no problema, como quero todos os números de 1 a 100 inclusive, faço o xrange(1,101).

Abraços.