python - queries - sqlalchemy documentation
matraz-sqlalchemy o sqlalchemy (6)
Aquí hay un ejemplo de un matraz de beneficio: sqlalchemy te da más que sqlalchemy simple.
Supongamos que está utilizando 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. El UserManager de clase 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 usa flask-sqlalchemy, puede usar el SQLAlchemyAdapter incorporado. Si está utilizando sqlalchemy (not-flask-sqlalchemy), puede hacer suposiciones diferentes 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.
Soy nuevo tanto en frasco como en sqlalchemy, simplemente empiezo a trabajar en una aplicación de matraz, y estoy usando sqlalchemy por ahora. Me preguntaba si hay algún beneficio significativo que pueda obtener al usar el frasco-sqlalchemy frente a 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.
Flask-SQLAlchemy te da una cantidad de bonitos extras que, de lo contrario, terminarías implementándote usando SQLAlchemy.
Aspectos positivos sobre el uso de Flask-SQLAlchemy
- Flask_SQLAlchemy maneja la configuración de la sesión, la configuración y el desmontaje para usted.
- Le da un modelo base declarativo que facilita la consulta y la paginación
- Configuración específica de back-end. Flask-SQLAlchemy escanea las librerías instaladas para compatibilidad con Unicode y, si falla, utiliza SQLAlchemy Unicode automáticamente.
- Tiene un método llamado
apply_driver_hacks
que establece automáticamente los valores por defecto en thigs como el tamaño de grupo de MySQL - Tiene buena compilación en los métodos 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
- 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 automáticamente nombres de tabla. Flask-SQLAlchemy establece automáticamente los nombres de su tabla convirtiendo su ClassName
> class_name
Esto se puede invalidar configurando __tablename__
class List item
Lados negativos en el uso de Flask-SQLAlchemy
- Usar Flask-SQLAlchemy hará que se agreguen dificultades adicionales para migrar desde Flask, digamos Pyramid, si alguna vez lo necesita. Esto se debe principalmente al modelo base declarativo personalizado en Flask_SQLAchemy.
- Usando Flask-SQLAlchemy, corre el riesgo de utilizar un paquete con una comunidad mucho más pequeña que SQLAlchemy, que no puedo eliminar fácilmente del desarrollo activo en el corto plazo.
- Algunos buenos extras que Flask-SQLAlchemy tiene pueden confundirte si no sabes que están allí.
La característica principal de Flask-SQLAlchemy
es 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 de ámbito 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 la descripción general de ellos: Demystifying 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 sencillo (que se usa en otro proyecto en el que estoy trabajando) es simplemente dejar caer el Flask-SQLAlchemy
y no usar ninguna de las características adicionales que proporciona. Tendrás la db.session
y podrás utilizarla como si fuera una configuración SQLAlchemy
pura.
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 usen como disponibles.
Esta cita y una motivación detallada se pueden encontrar en la segunda pregunta de las Preguntas frecuentes de la sesión .
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 de Flask bastante compleja con múltiples bases de datos / conexiones (maestro-esclavo) usando ORM y 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 para usted, que a menudo no es lo que necesita.
como @schlamar sugiere que Flask-SqlAlchemy es definitivamente algo bueno. Me gustaría agregar un contexto extra al punto hecho 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 casos simples, Flask-Sqlalchemy estará totalmente bien. El punto extra que quisiera hacer es que si Flask-Sqlalchemy no hará lo que usted desea, 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 de Flask-Sqlalchemy.