SQLAlchemy ORM conversión a Pandas DataFrame

En este artículo, veremos cómo convertir un ORM SQLAlchemy a Pandas DataFrame usando Python.

Necesitamos tener la biblioteca sqlalchemy y pandas instalada en el entorno de python:

$ pip install sqlalchemy
$ pip install pandas

Para nuestro ejemplo, haremos uso de la base de datos MySQL donde ya hemos creado una tabla llamada estudiantes. Puede usar cualquier base de datos, pero debe crear su string de conexión en consecuencia. El script SQL sin procesar como referencia para este ejemplo se proporciona a continuación:

CREATE DATABASE Geeks4Geeks;
USE Geeks4Geeks;

CREATE TABLE students (
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    course VARCHAR(50),
    score FLOAT
);

INSERT INTO students VALUES
('Ashish', 'Mysterio', 'Statistics', 96),
('Rahul', 'Kumar', 'Statistics', 83),
('Irfan', 'Malik', 'Statistics', 66),
('Irfan', 'Ahmed', 'Statistics', 81),
('John', 'Wick', 'Statistics', 77),
('Mayon', 'Irani', 'Statistics', 55),
('Ashish', 'Mysterio', 'Sociology', 85),
('Rahul', 'Kumar', 'Sociology', 78),
('Irfan', 'Malik', 'Biology', 92),
('Irfan', 'Ahmed', 'Chemistry', 45),
('John', 'Wick', 'Biology', 78),
('Mayon', 'Irani', 'Physics', 78);

SELECT * FROM students;

La sintaxis para convertir SQLAlchemy ORM en un marco de datos de pandas es la misma que haría para una consulta SQL sin procesar, que se indica a continuación:

Sintaxis: pandas.read_sql(sql, con, **kwargs)

Dónde:

  • sql: La instrucción SQL SELECT que se ejecutará
  • con: objeto del motor SQLAlchemy para establecer una conexión a la base de datos

Tenga en cuenta que también puede usar pandas.read_sql_query() en lugar de pandas.read_sql()

Ejemplo 1:

En el ejemplo anterior, podemos ver que el parámetro sql del método pandas.read_sql() toma la consulta ORM de SQLAlchemy tal como la definimos sin la conversión del marco de datos de pandas. El db.select() se convertirá en una consulta SQL sin formato cuando lo lea el método read_sql() . En la salida, también hemos impreso el tipo del objeto de respuesta. La salida es un objeto Pandas DataFrame donde hemos obtenido todos los registros presentes en la tabla del estudiante.

Python3

import pandas
import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
 
Base = declarative_base()
 
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql:\
//root:password@localhost/Geeks4Geeks")
 
# CREATE THE TABLE MODEL TO USE IT FOR QUERYING
class Students(Base):
 
    __tablename__ = 'students'
 
    first_name = db.Column(db.String(50),
                           primary_key=True)
    last_name  = db.Column(db.String(50),
                           primary_key=True)
    course     = db.Column(db.String(50))
    score      = db.Column(db.Float)
 
# SQLAlCHEMY ORM QUERY TO FETCH ALL RECORDS
df = pandas.read_sql_query(
    sql = db.select([Students.first_name,
                     Students.last_name,
                     Students.course,
                     Students.score]),
    con = engine
)
 
print("Type:", type(df))
print()
print(df)

Producción:

Ejemplo 2:

En este ejemplo, hemos utilizado el objeto de sesión para vincular el motor de conexión. También hemos aplicado un método filter() que es equivalente a la cláusula WHERE en SQL. Consiste en la condición de que los registros seleccionados deben contener el nombre y el apellido de aquellos estudiantes que tengan una puntuación superior a 80. Una cosa que vale la pena señalar aquí es que, para las consultas construidas usando el objeto de sesión, necesitamos use el atributo de declaración para convertir explícitamente en una consulta SQL sin procesar. Esto es necesario porque sin el atributo de declaración, será un objeto sqlalchemy.orm.query.Query que no puede ser ejecutado por el método pandas.read_sql() y obtendrá un sqlalchemy.exc.ObjectNotExecutableErrorerror. El resultado anterior muestra el tipo de objeto que es un DataFrame de pandas junto con la respuesta.

Python3

import pandas
import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
 
Base = declarative_base()
 
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql:\
//root:password@localhost/Geeks4Geeks")
 
# CREATE THE TABLE MODEL TO USE IT FOR QUERYING
class Students(Base):
 
    __tablename__ = 'students'
 
    first_name = db.Column(db.String(50),
                           primary_key=True)
    last_name  = db.Column(db.String(50),
                           primary_key=True)
    course     = db.Column(db.String(50))
    score      = db.Column(db.Float)
 
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
 
# SQLAlCHEMY ORM QUERY TO FETCH ALL RECORDS
df = pandas.read_sql_query(
    sql = session.query(Students.first_name,
                        Students.last_name).filter(
      Students.score > 80).statement,
    con = engine
)
 
print("Type:", type(df))
print()
print(df)

Producción:

Publicación traducida automáticamente

Artículo escrito por apathak092 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *