frasco-sqlalchemy o sqlalchemy


93

Soy nuevo tanto en flask como en sqlalchemy, acabo de empezar a trabajar en una aplicación de flask y estoy usando sqlalchemy por ahora. Me preguntaba si hay algún beneficio significativo que pueda obtener al usar flask-sqlalchemy vs sqlalchemy. No pude encontrar suficientes motivaciones en http://packages.python.org/Flask-SQLAlchemy/index.html o tal vez no entendí el valor. Agradecería sus aclaraciones.


6
Hmm, todavía no hay una respuesta satisfactoria aquí. ¿Alguien puede explicar cuáles son los beneficios reales de hormigón flask-sqlalchemyson más viejo y simple sqlalchemyen una aplicación frasco?
Steve Bennett

Sin embargo, una gran desventaja es Flask-SqlAlchemyque no proporciona ninguna forma de configurar la tenencia múltiple en la aplicación. Eso es lo más negativo de la OMI. bindslo único que se proporciona es adjuntar una base de datos diferente a un modelo diferente, mientras que no hay forma de usar una base de datos específica de inquilinos con el mismo modelo.
Rohit Jain

Respuestas:


67

La característica principal de la Flask-SQLAlchemyes la integración adecuada con la aplicación Flask: crea y configura el motor, la conexión y la sesión y lo configura para que funcione con la aplicación Flask.

Esta configuración es bastante compleja, ya que necesitamos crear la sesión con alcance y manejarla adecuadamente de acuerdo con el ciclo de vida de solicitud / respuesta de la aplicación Flask.

En el mundo ideal, esa sería la única característica de Flask-SQLAlchemy, pero en realidad agrega algunas cosas más. Aquí hay una buena publicación de blog con una descripción general de ellos: Desmitificando Flask-SQLAlchemy .

Cuando trabajé por primera vez con Flask y SQLAlchemy, no me gustó esta sobrecarga. Fui y extraje el código de administración de sesión de la extensión. Este enfoque funciona, aunque descubrí que es bastante difícil hacer esta integración correctamente.

Entonces, el enfoque más fácil (que se usa en otro proyecto en el que estoy trabajando) es simplemente ingresar Flask-SQLAlchemyy no usar ninguna de las funciones adicionales que proporciona. Tendrá el db.sessiony podrá usarlo como si fuera una SQLAlchemyconfiguración pura .


4
Me quedo confundido. La publicación del blog vinculada (¡y los documentos oficiales!) Enumera algunas características simples de SQLAlchemy (como la base declarativa) como si fueran características de Flask-SQLAlchemy; No está claro si se están atribuyendo el mérito de las cosas integradas en SQLAlchemy o si lo han vuelto a implementar (ni por qué lo hicieron, si es lo último). Su primer párrafo enumera dos características: envoltorios de conveniencia para la administración de sesiones (pero ¿no necesitará rodar los suyos de todos modos si desea usar sus modelos SQLAlchemy fuera de Flask?) Y alguna "configuración" no especificada para "trabajar con la aplicación Flask" . ¿Qué ese medio ?
Mark Amery

1
También estoy un poco confundido por las preguntas. La publicación del blog vinculada es bastante clara en mi opinión, por ejemplo, dice "Modelo base declarativo personalizado con soporte para la propiedad de consulta y paginación", la clave es "personalizada" y "con soporte para la propiedad de consulta y la paginación" es lo que agrega además Base declarativa de SQLAlchemy.
Boris Serebrov

1
En cuanto a los "envoltorios de conveniencia", no son por conveniencia, sino para que las cosas funcionen correctamente. Para comenzar a usar SQLAlchemy, necesita los objetos de conexión de la base de datos (eninge / conexión / sesión) y no desea crearlos cada vez que necesite realizar una consulta SQL, por lo que deben crearse globalmente y estar disponibles en el código de la aplicación. Entonces puede hacer algo como "desde su aplicación, importar db" y luego hacer "db.session.something ()" sin pensar en cómo crear e inicializar este objeto "db" correctamente.
Boris Serebrov

Y con respecto a la "configuración" no especificada para "trabajar con la aplicación Flask", en realidad se especifica en el segundo párrafo: 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.Vea más detalles en los documentos de SQLAlchemy: ¿ Cuándo construyo una sesión, cuándo la confirmo y cuándo ¿cierralo? y sesiones contextuales / locales de subprocesos .
Boris Serebrov

20

Para ser honesto, no veo ningún beneficio. En mi humilde opinión, Flask-SQLAlchemy crea una capa adicional que realmente no necesitas. En nuestro caso tenemos una aplicación Flask bastante compleja con múltiples bases de datos / conexiones (maestro-esclavo) usando tanto ORM como Core donde, entre otras cosas, necesitamos controlar nuestras sesiones / transacciones DB (por ejemplo, modos dryrun vs commit). Flask-SQLAlchemy agrega algunas funcionalidades adicionales, como la destrucción automática de la sesión, asumiendo algunas cosas por usted que a menudo no son lo que necesita.


5
Sí, en su caso de uso, Flask-SQLAlchemy parece obsoleto. Pero si el OP tuviera tal escenario, probablemente no haría esta pregunta. Para un nuevo usuario que no sabe nada sobre el alcance de la sesión, ¡ Flask-SQLAlchemy es definitivamente imprescindible!
schlamar

20

Flask-SQLAlchemy le ofrece una serie de buenos extras que, de lo contrario, terminaría implementando usted mismo usando SQLAlchemy.

Lados positivos sobre el uso de Flask-SQLAlchemy


  1. Flask_SQLAlchemy se encarga de la configuración, instalación y desmontaje de la sesión por usted.
  2. Le brinda un modelo base declarativo que facilita la consulta y la paginación
  3. Configuraciones específicas de backend. Flask-SQLAlchemy escanea las bibliotecas instaladas para soporte Unicode y si falla automáticamente usa SQLAlchemy Unicode.
  4. Tiene un método llamado apply_driver_hacksque establece automáticamente los valores predeterminados sanos en cosas como el tamaño del grupo de MySQL
  5. Tiene buenos métodos de construcción create_all () y drop_all () para crear y eliminar todas las tablas. Útil para probar y en la línea de comando de Python si hiciste algo estúpido
  6. Le da get_or_404 () en lugar de get () y find_or_404 () en lugar de find () Ejemplo de código en> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Establecer nombres de tablas automáticamente. Flask-SQLAlchemy establece automáticamente los nombres de sus tablas convirtiendo su ClassName> class_nameesto se puede anular configurando la __tablename__clase Elemento de lista

Los lados negativos del uso de Flask-SQLAlchemy


  1. El uso de Flask-SQLAlchemy agregará dificultades adicionales para migrar desde Flask a, digamos, Pyramid si alguna vez lo necesita. Esto se debe principalmente al modelo base declarativo personalizado en Flask_SQLAchemy.
  2. Al usar Flask-SQLAlchemy, corre el riesgo de usar un paquete con una comunidad mucho más pequeña que la propia SQLAlchemy, que no puedo eliminar fácilmente del desarrollo activo en el corto plazo.
  3. Algunos buenos extras que tiene Flask-SQLAlchemy pueden confundirte si no sabes que están ahí.

15

La documentación de SQLAlchemy establece claramente que debe usar Flask-SQLAlchemy (¡especialmente si no comprende sus beneficios!):

[...] productos como Flask-SQLAlchemy [...] SQLAlchemy recomienda enfáticamente que estos productos se utilicen según estén disponibles.

Puede encontrar esta cita y una motivación detallada en la segunda pregunta de las Preguntas frecuentes de la sesión .


2
Flask-sqlalchemy parece no mantenerse. La última actualización fue el 1 de agosto de 2013. ¿Este consejo ya es relevante?
pmav99

@ pmav99 siempre que no tenga problemas concretos con él, lo recomendaría, especialmente para los nuevos usuarios.
schlamar

1
Parece mantenerse activamente a partir de noviembre de 2014. Muchas confirmaciones recientes. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett

25
Aunque OP no lo preguntó directamente, en mi opinión. quería conocer los beneficios de Flask-SQLAlchemy. Su respuesta es literalmente "úselo incluso si no sabe cuáles son los beneficios". Sí, ¿cuáles son los beneficios?
Markus Meskanen

1
Esta respuesta no responde a la pregunta del OP. Está recomendando flask-sqlalchemy, sin proporcionar mucho razonamiento detrás de la recomendación.
mbadawi23

7

como sugiere @schlamar, Flask-SqlAlchemy es definitivamente algo bueno. Me gustaría agregar un poco de contexto adicional al punto que se hizo allí.

No sienta que está eligiendo uno sobre el otro. Por ejemplo, digamos que queremos tomar todos los registros de una tabla usando un modelo usando Flask-Sqlalchemy. Es tan simple como

Model.query.all()

Para muchos de los casos simples, Flask-Sqlalchemy va a estar totalmente bien. El punto adicional que me gustaría hacer es que si Flask-Sqlalchemy no va a hacer lo que usted quiere, entonces no hay razón para que no pueda usar SqlAlchemy directamente.

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 puede ver, podemos saltar fácilmente de uno a otro sin problemas y, en el segundo ejemplo, de hecho estamos usando los modelos definidos por Flask-Sqlalchemy.


1
"Por ejemplo, digamos que queremos tomar todos los registros de una tabla usando un modelo usando Flask-Sqlalchemy. Es tan simple como Model.query.all()" - todo esto se puede hacer solo con SQLAlchemy, usar Flask-SQLAlchemy no proporciona absolutamente nada nuevo aquí.
Markus Meskanen

¡usted es maravilloso! Me topé con esta publicación y resolvió un problema que estaba teniendo. después de instalar anaconda, por alguna razón, las actualizaciones normales no funcionaban. cambiado de Model.query.all()a db.session.query(Model).all()por alguna razón permitió que las sesiones rastrearan y actualizaran normalmente.
Jeff Bluemel

2

Aquí hay un ejemplo de un beneficio que el frasco-sqlalchemy le brinda sobre el simple sqlalchemy.

Suponga que está usando flask_user.

flask_user automatiza la creación y autenticación de objetos de usuario, por lo que necesita acceder a su base de datos. La clase UserManager hace esto llamando a algo llamado "adaptador" que abstrae las llamadas a la base de datos. Proporciona un adaptador en el constructor UserManager y el adaptador debe implementar estas funciones:

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

Si está usando flask-sqlalchemy, puede usar el SQLAlchemyAdapter incorporado. Si está utilizando sqlalchemy (not-flask-sqlalchemy), puede hacer diferentes suposiciones sobre la forma en que los objetos se guardan en la base de datos (como los nombres de las tablas), por lo que tendrá que escribir su propia clase de adaptador.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.