Crear objetos DataFrame desde bases de datos SQL

Estándar

En una entrada anterior describimos cómo cargar datos desde un archivo CSV. En esta entrada, veremos cómo cargar los contenidos de una tabla SQL el un DataFrame.

Para ello usaremos el método DataFrame.read_sql().
Lo primero que necesitábamos es una base de datos MySQL (o similar) activa. Necesitamos establecer una conexión a la base de datos usando SQL Alchemy. SQL Alchemy es una librería muy potente para manejar bases de datos; si tienes tiempo para conocerla mejor, será muy útil si trabajas a menudo con bases de datos. Asimismo, necesitaremos instalar un driver de MySQL; en este caso, usaremos PyMySQL. Se puede obtener mediante using pip o el gestor de librerías de la distribución.

>>> from sqlalchemy import create_engine
>>> engine = create_engine('mysql+pymysql://username:password@hostname:3306/dbname')

A continuación, con la conexión ya establecida, abrimos una tabla o ejecutamos una query SQL con el método DataFrame.read_sql().

>>> with engine.connect() as conn, conn.begin():
>>>     data = pd.read_sql('mytable', conn)
>>>     print(data)
      User  Age            Email
0    Alice   21    alice@foo.com
1      Bob   11   bob@sponge.com
2  Charlie   32  charles@baz.com

Hemos usado 'mytable' para seleccionar la tabla completa, pero podemos ejecutar una query SQL:

>>> with engine.connect() as conn, conn.begin():
>>>     data = pd.read_sql('select * from mytable where Age>18', conn)
>>>     print(data)
      User  Age            Email
0    Alice   21    alice@foo.com
1  Charlie   32  charles@baz.com

Una vez que los datos están en el objeto DataFrame, podemos manipularlos con la funcionalidad que proporciona Pandas.

>>> data['Domain'] = data.apply(lambda x: x['Email'].split('@')[1],axis=1)
>>> print(data)

      User  Age            Email      Domain
0    Alice   21    alice@foo.com     foo.com
1      Bob   11   bob@sponge.com  sponge.com
2  Charlie   32  charles@baz.com     baz.com

Podemos guardar los resultados de nuevo en una base de datos con DataFrame.to_sql(). No obstante (y corrígeme en los comentarios si me equivoco), no podemos actualizar entradas existentes en una tabla. Tan sólo podemos crear una tabla nueva, sobreescribir una existente o concatenar los datos.

>>> with engine.connect() as conn, conn.begin():
>>>     data.to_sql('mytable_new',conn,index=False)

Esta es la funcionalidad más básica, y con ella podemos implementar toda la funcionalidad que sepamos hacer en SQL; siempre recordando que una vez que leemos los datos de la tabla, no tendremos acceso a las entradas que no fueron devueltas por la query (a menos que hagamos una nueva llamada a DataFrame.read_sql().
Para ver todas las opciones disponibles, podemos revisar las documentaciones de read_sql() y to_sql().

Deja una respuesta

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