Saltar al contenido

Python Pandas to_sql, cómo crear una tabla con un primario key?

Posteriormente a investigar con especialistas en el tema, programadores de varias áreas y profesores hemos dado con la solución al problema y la plasmamos en esta publicación.

Solución:

Simplemente agregue el principal key después de subir la tabla con pandas.

group_export.to_sql(con=engine, name=example_table, if_exists='replace', 
                    flavor='mysql', index=False)

with engine.connect() as con:
    con.execute('ALTER TABLE `example_table` ADD PRIMARY KEY (`ID_column`);')

Descargo de responsabilidad: esta respuesta es más experimental que práctica, pero tal vez valga la pena mencionarla.

encontré esa clase pandas.io.sql.SQLTable ha nombrado argumento key y si le asigna el nombre del campo, este campo se convierte en el principal key:

Desafortunadamente, no puedes simplemente transferir este argumento de DataFrame.to_sql() función. Para usarlo debes:

  1. crear pandas.io.SQLDatabase instancia

    engine = sa.create_engine('postgresql:///somedb')
    pandas_sql = pd.io.sql.pandasSQL_builder(engine, schema=None, flavor=None)
    
  2. definir función análoga a pandas.io.SQLDatabase.to_sql() pero con adicional *kwargs argumento que se pasa a pandas.io.SQLTable objeto creado dentro de él (acabo de copiar original to_sql() método y añadido *kwargs):

    def to_sql_k(self, frame, name, if_exists='fail', index=True,
               index_label=None, schema=None, chunksize=None, dtype=None, **kwargs):
        if dtype is not None:
            from sqlalchemy.types import to_instance, TypeEngine
            for col, my_type in dtype.items():
                if not isinstance(to_instance(my_type), TypeEngine):
                    raise ValueError('The type of %s is not a SQLAlchemy '
                                     'type ' % col)
    
        table = pd.io.sql.SQLTable(name, self, frame=frame, index=index,
                         if_exists=if_exists, index_label=index_label,
                         schema=schema, dtype=dtype, **kwargs)
        table.create()
        table.insert(chunksize)
    
  3. llame a esta función con su SQLDatabase instancia y el marco de datos que desea guardar

    to_sql_k(pandas_sql, df2save, 'tmp',
            index=True, index_label='id', keys='id', if_exists='replace')
    

Y obtenemos algo como

CREATE TABLE public.tmp
(
  id bigint NOT NULL DEFAULT nextval('tmp_id_seq'::regclass),
...
)

en la base de datos

PD Por supuesto que puedes parchear a los monos DataFrame, io.SQLDatabase y io.to_sql() funciones para utilizar esta solución con comodidad.

Te invitamos a añadir valor a nuestra información tributando tu experiencia en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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