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.


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 .


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.


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á.

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 .


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.