Eu sou novo tanto em frasco quanto em sqlalchemy, acabei de começar a trabalhar em um aplicativo de frasco e estou usando sqlalchemy por enquanto. Eu queria saber se há algum benefício significativo que posso obter com o uso de flask-sqlalchemy vs sqlalchemy. Não consegui encontrar motivações suficientes em http://packages.python.org/Flask-SQLAlchemy/index.html ou talvez não tenha entendido o valor !! Eu gostaria de receber seus esclarecimentos.
93
flask-sqlalchemy
são mais velho lisosqlalchemy
em um aplicativo Flask?Flask-SqlAlchemy
ele não oferece nenhuma maneira de configurar a multilocação no aplicativo. Esse é o maior negativo da IMO.binds
fornecido apenas para anexar um banco de dados diferente a um modelo diferente, embora não haja como usar um banco de dados específico do locatário com o mesmo modelo.Respostas:
O principal recurso do
Flask-SQLAlchemy
é a integração adequada com o aplicativo Flask - ele cria e configura o mecanismo, a conexão e a sessão e os configura para funcionar com o aplicativo Flask.Essa configuração é bastante complexa, pois precisamos criar a sessão com escopo definido e tratá-la adequadamente de acordo com o ciclo de vida de solicitação / resposta do aplicativo Flask.
No mundo ideal, essa seria a única característica
Flask-SQLAlchemy
, mas na verdade acrescenta mais algumas coisas. Aqui está uma boa postagem no blog com uma visão geral deles: Demystifying Flask-SQLAlchemy .Quando trabalhei pela primeira vez com Flask e SQLAlchemy, não gostei dessa sobrecarga. Eu fui até lá e extraí o código de gerenciamento de sessão da extensão. Essa abordagem funciona, embora eu tenha descoberto que é muito difícil fazer essa integração corretamente.
Portanto, a abordagem mais fácil (que é usada em outro projeto em que estou trabalhando) é simplesmente entrar
Flask-SQLAlchemy
e não usar nenhum dos recursos adicionais que ele oferece. Você terá odb.session
e poderá usá-lo como se fosse umaSQLAlchemy
configuração pura .fonte
This setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.
Veja mais detalhes nos documentos do SQLAlchemy: Quando eu construo uma Sessão, quando eu a submeto e quando eu fecha-o? e sessões contextuais / thread-local .Para ser honesto, não vejo nenhum benefício. IMHO, Flask-SQLAlchemy cria uma camada adicional de que você realmente não precisa. Em nosso caso, temos um aplicativo Flask bastante complexo com vários bancos de dados / conexões (mestre-escravo) usando ORM e Core onde, entre outras coisas, precisamos controlar nossas sessões / transações de banco de dados (por exemplo, modos dryrun vs commit). O Flask-SQLAlchemy adiciona algumas funcionalidades adicionais, como a destruição automática da sessão, assumindo algumas coisas para você que muitas vezes não são o que você precisa.
fonte
O Flask-SQLAlchemy oferece uma série de extras interessantes que você mesmo implementaria usando o SQLAlchemy.
Lados positivos no uso de Flask-SQLAlchemy
apply_driver_hacks
que define automaticamente padrões sãos para thigs como MySQL pool-sizeDefinir nomes de tabelas automaticamente. Flask-SQLAlchemy define automaticamente os nomes das suas tabelas, convertendo o seu
ClassName
>class_name
isso pode ser sobrescrito ao definir a__tablename__
classe List itemLados negativos sobre o uso de Flask-SQLAlchemy
fonte
A documentação do SQLAlchemy afirma claramente que você deve usar o Flask-SQLAlchemy (especialmente se você não entende seus benefícios!):
Esta citação e uma motivação detalhada podem ser encontradas na segunda pergunta do FAQ da Sessão .
fonte
como @schlamar sugere, Flask-SqlAlchemy é definitivamente uma coisa boa. Eu apenas gostaria de adicionar algum contexto extra ao ponto aqui exposto.
Não sinta que está escolhendo um sobre o outro. Por exemplo, digamos que queremos pegar todos os registros de uma tabela usando um modelo usando Flask-Sqlalchemy. É tão simples quanto
Para muitos dos casos simples, Flask-Sqlalchemy vai funcionar totalmente. O ponto extra que eu gostaria de fazer é, se Flask-Sqlalchemy não vai fazer o que você quer, então não há razão para que você não possa usar SqlAlchemy diretamente.
Como você pode ver, podemos facilmente pular de um para o outro sem problemas e no segundo exemplo estamos de fato usando os modelos definidos pelo Flask-Sqlalchemy.
fonte
Model.query.all()
" - tudo isso pode ser feito apenas com SQLAlchemy, usando Flask-SQLAlchemy não fornece absolutamente nada de novo aqui.Model.query.all()
paradb.session.query(Model).all()
por algum motivo permitiu que as sessões fossem rastreadas e atualizadas normalmente.Aqui está um exemplo de um benefício flask-sqlalchemy oferece a você sobre sqlalchemy simples.
Suponha que você esteja usando flask_user.
flask_user automatiza a criação e autenticação de objetos de usuário, portanto, ele precisa acessar seu banco de dados. A classe UserManager faz isso chamando algo chamado "adaptador" que abstrai as chamadas do banco de dados. Você fornece um adaptador no construtor UserManager, e o adaptador deve implementar estas funções:
Se você estiver usando flask-sqlalchemy, poderá usar o SQLAlchemyAdapter integrado. Se você estiver usando sqlalchemy (not-flask-sqlalchemy), poderá fazer suposições diferentes sobre a maneira como os objetos são salvos no banco de dados (como os nomes das tabelas), portanto, você terá que escrever sua própria classe de adaptador.
fonte