Red de conocimientos turísticos - Información de alquiler - Consulta de tabla relacionada en Flask-SQLAlchemy

Consulta de tabla relacionada en Flask-SQLAlchemy

SQLAlchemy es un poderoso ORM. Flask-SQLAlchemy es un complemento de Flask que facilita el uso de SQLAlchemy con el marco de Flask.

Esta publicación de blog presentará parte de mi experiencia en el uso de Flask-SQLAlchemy 2.1 para realizar consultas de unión de tablas.

Hay dos tablas, una es la tabla de cuentas que guarda el ID de la cuenta y otra apodo, y el otro es Es una tabla vinculante que guarda la vinculación entre cuentas.

El modelo correspondiente es el siguiente:

Veamos un ejemplo simple: consultar todas las cuentas vinculadas a la cuenta gameuid 1000.

Ver la declaración SQL resultante:

La consulta de la tabla de unión aquí utiliza la declaración WHERE. Si desea utilizar una declaración JOIN, puede escribirla así:

Como puede ver, la declaración SQL generada ahora usa una declaración JOIN. Sin embargo, la semántica de la declaración anterior es un poco extraña, ya que ya está utilizando Bind y Account en la consulta, y concatenar Account más tarde parece redundante. Entonces, ¿cómo elige SQLAlchemy quién llega primero y quién llega último en JOIN? Mire este error:

Este error muestra claramente que el orden de los parámetros en la consulta es importante. La tabla representada por el primer parámetro es la primera tabla que se conecta en JOIN, por lo que el objetivo de. JOIN debe ser Cuenta, no Vincularse.

El ejemplo anterior aborda la mayoría de los requisitos. Sigamos discutiendo la paginación. Flask-SQLAlchemy encapsula un método de paginación que puede paginar fácilmente registros de consulta:

El motivo del error es que db.session.query devuelve un objeto orm.Query de forma predeterminada, que no contiene el método de paginación. Para resolver este problema, debe modificar el código fuente de Flask-SQLAlchemy.

Busque la definición __init__ del objeto SQLAlchemy y agregue session_options['query_cls'] = BaseQuery:

En el objeto modelo proporcionado por Flask-SQLAlchemy, puede usar la sintaxis de consulta. así se obtiene directamente la consulta. Esto se debe a que hay una clase _QueryProperty en Flask-SQLAlchemy, que genera automáticamente un objeto de consulta basado en la sesión actual cada vez que se llama a Model.__get__:

El objeto de consulta obtenido usando Model.query se puede usar directamente Para ejecutar JOINT:

El objeto de consulta obtenido usando Model.query se puede usar directamente para ejecutar JOINT:

El objeto de consulta obtenido usando Model.query se puede usar directamente para ejecutar la operación JOINT. Y el resultado es un objeto Modelo. Esto es mucho más conveniente:

El resultado convertido a SQL se ve así:

Como puede ver, los resultados de esta consulta no son diferentes a los del uso de db.session.query. Dado que devuelve un objeto modelo, puede resultar más conveniente utilizarlo.

¿Cómo utilizar la sintaxis Model.query.join para obtener algunos campos? Así es como se utiliza el método with_entities proporcionado por SQLAlchemy:

Tenga en cuenta que el elemento de la lista (2, 'player10001') no es una tupla estándar de Python. Si observa su tipo, verá To; un nombre extraño: ; . Este es un objeto AbstractKeyedTuple con un método llaves(), por lo que se puede convertir fácilmente en un dict:

Para obtener más información sobre AbstractKeyedTuple, consulte esta documentación. La nueva implementación de KeyedTuple tiene una velocidad significativamente más rápida.

Además de filtrar campos, existe otra forma de obtener registros para múltiples modelos. Es decir, devolver todos los campos de ambos modelos:

Utilice la sintaxis anterior para devolver objetos Cuenta y Enlace directamente para mayor flexibilidad.

Para conectar más de 2 tablas, puede llamar directamente a la conexión en cadena después del resultado de la conexión. También puedes encadenar una unión después de los resultados del filtro. Ambos unen y filtran objetos de consulta de retorno, para que pueda encadenarlos infinitamente.

Después de escribir la consulta, debe imprimir la declaración SQL resultante para ver si hay algún problema de rendimiento.