flask-sqlalchemy ou sqlalchemy

93

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.

Amin
fonte
6
Hmm, ainda não há uma resposta satisfatória aqui. Alguém pode explicar o que os benefícios concretos reais flask-sqlalchemysão mais velho liso sqlalchemyem um aplicativo Flask?
Steve Bennett
Uma grande desvantagem, porém, é que Flask-SqlAlchemyele não oferece nenhuma maneira de configurar a multilocação no aplicativo. Esse é o maior negativo da IMO. bindsfornecido 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.
Rohit Jain

Respostas:

67

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-SQLAlchemye não usar nenhum dos recursos adicionais que ele oferece. Você terá o db.sessione poderá usá-lo como se fosse uma SQLAlchemyconfiguração pura .

Boris Serebrov
fonte
4
Eu continuo confuso. A postagem do blog vinculada (e os documentos oficiais!) Lista alguns recursos simples do SQLAlchemy (como a base declarativa) como se fossem recursos do Flask-SQLAlchemy; não está claro se eles estão recebendo crédito por coisas incorporadas ao SQLAlchemy ou se o reimplementaram (nem por que o fizeram, se for o último). Seu primeiro parágrafo lista dois recursos: wrappers de conveniência para gerenciamento de sessão (mas você não vai precisar fazer o seu próprio de qualquer maneira se quiser usar seus modelos SQLAlchemy fora do Flask?) E algumas "configurações" não especificadas para "trabalhar com o aplicativo Flask" . O que isso significa ?
Mark Amery
1
Também estou um pouco confuso com as perguntas. O post do blog vinculado é bastante claro na IMO, por exemplo, diz "Modelo de base declarativo personalizado com suporte para propriedade de consulta e paginação", a chave é "personalizado" e "com suporte para propriedade de consulta e paginação" é o que adiciona no topo Base declarativa de SQLAlchemy.
Boris Serebrov
1
Quanto aos "invólucros de conveniência" - eles não são para conveniência, mas para fazer as coisas funcionarem corretamente. Para começar a usar o SQLAlchemy, você precisa dos objetos de conexão de banco de dados (eninge / conexão / sessão) e não deseja criá-los toda vez que precisar fazer uma consulta SQL, portanto, eles devem ser criados globalmente e disponíveis no código do aplicativo. Então você pode fazer algo como "from yourapplication import db" e então fazer "db.session.something ()" sem pensar em como criar e inicializar este objeto "db" apropriadamente.
Boris Serebrov
E com relação à "configuração" não especificada para "trabalhar com o aplicativo Flask" - ela é especificada no segundo parágrafo: 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 .
Boris Serebrov
20

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.

MOCKBA
fonte
5
Sim, em seu caso de uso Flask-SQLAlchemy parece obsoleto. Mas se o OP tivesse esse cenário, ele provavelmente não faria essa pergunta. Para um novo usuário que não sabe nada sobre o escopo da sessão, o Flask-SQLAlchemy é definitivamente obrigatório!
schlamar
20

O Flask-SQLAlchemy oferece uma série de extras interessantes que você mesmo implementaria usando o SQLAlchemy.

Lados positivos no uso de Flask-SQLAlchemy


  1. Flask_SQLAlchemy lida com a configuração, instalação e desmontagem da sessão para você.
  2. Oferece um modelo de base declarativo que torna a consulta e a paginação mais fáceis
  3. Configurações específicas do back-end. O Flask-SQLAlchemy verifica as bibliotecas instaladas em busca de suporte a Unicode e, em caso de falha, usa automaticamente o SQLAlchemy Unicode.
  4. Tem um método chamado apply_driver_hacksque define automaticamente padrões sãos para thigs como MySQL pool-size
  5. Possui bons métodos de construção create_all () e drop_all () para criar e eliminar todas as tabelas. Útil para testes e em linha de comando python se você fez algo estúpido
  6. Ele fornece get_or_404 () em vez de get () e find_or_404 () em vez de find () Exemplo de código em> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Definir nomes de tabelas automaticamente. Flask-SQLAlchemy define automaticamente os nomes das suas tabelas, convertendo o seu ClassName> class_nameisso pode ser sobrescrito ao definir a __tablename__classe List item

Lados negativos sobre o uso de Flask-SQLAlchemy


  1. Usar o Flask-SQLAlchemy aumentará as dificuldades adicionais para a migração do Flask para, digamos, a pirâmide, se você precisar. Isso se deve principalmente ao modelo de base declarativo customizado em Flask_SQLAchemy.
  2. Usando o Flask-SQLAlchemy, você corre o risco de usar um pacote com uma comunidade muito menor do que o próprio SQLAlchemy, que não posso retirar facilmente do desenvolvimento ativo tão cedo.
  3. Alguns extras legais que o Flask-SQLAlchemy tem podem deixá-lo confuso se você não souber que eles estão lá.
Kimmo Hintikka
fonte
15

A documentação do SQLAlchemy afirma claramente que você deve usar o Flask-SQLAlchemy (especialmente se você não entende seus benefícios!):

produtos como Flask-SQLAlchemy [...] SQLAlchemy recomenda enfaticamente que esses produtos sejam usados ​​conforme disponíveis.

Esta citação e uma motivação detalhada podem ser encontradas na segunda pergunta do FAQ da Sessão .

Schlamar
fonte
2
Flask-sqlalchemy parece não ter manutenção. A última atualização foi em 1º de agosto de 2013. Este conselho ainda é relevante?
pmav99
@ pmav99 contanto que você não tenha problemas concretos com ele, eu ainda recomendo, especialmente para novos usuários.
schlamar
1
Parece ter sido mantido ativamente em novembro de 2014. Muitos commits recentes. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett
25
Mesmo que OP não tenha perguntado diretamente, imo. ele queria saber os benefícios do Flask-SQLAlchemy. Sua resposta é literalmente "use mesmo que não saiba quais são os benefícios" - sim, quais são os benefícios?
Markus Meskanen
1
Esta resposta não responde à pergunta do OP. Você está recomendando flask-sqlalchemy, sem fornecer muito raciocínio por trás da recomendação.
mbadawi23
7

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

Model.query.all()

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.

from myapp.database import db

num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar()

db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()

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.

Mike Waites
fonte
1
"Por exemplo, digamos que queremos pegar todos os registros de uma tabela usando um modelo usando Flask-Sqlalchemy. É tão simples quanto Model.query.all()" - tudo isso pode ser feito apenas com SQLAlchemy, usando Flask-SQLAlchemy não fornece absolutamente nada de novo aqui.
Markus Meskanen
você é demais! Eu tropecei neste post e ele resolveu um problema que eu estava tendo. depois de instalar o anaconda, por algum motivo, as atualizações normais não estavam funcionando. alterado de Model.query.all()para db.session.query(Model).all()por algum motivo permitiu que as sessões fossem rastreadas e atualizadas normalmente.
Jeff Bluemel,
2

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:

class MyAdapter(DBAdapter):
    def get_object(self, ObjectClass, id):
        """ Retrieve one object specified by the primary key 'pk' """
        pass

    def find_all_objects(self, ObjectClass, **kwargs):
         """ Retrieve all objects matching the case sensitive filters in 'kwargs'. """
        pass


    def find_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case sensitive filters in 'kwargs'. """
        pass

    def ifind_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case insensitive filters in 'kwargs'. """
        pass

    def add_object(self, ObjectClass, **kwargs):
        """ Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """
        pass

    def update_object(self, object, **kwargs):
        """ Update object 'object' with the fields and values specified in '**kwargs'. """
        pass

    def delete_object(self, object):
        """ Delete object 'object'. """
        pass

    def commit(self):
        pass

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.

2-complexo
fonte