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:
-
crear
pandas.io.SQLDatabase
instanciaengine = sa.create_engine('postgresql:///somedb') pandas_sql = pd.io.sql.pandasSQL_builder(engine, schema=None, flavor=None)
-
definir función análoga a
pandas.io.SQLDatabase.to_sql()
pero con adicional*kwargs
argumento que se pasa apandas.io.SQLTable
objeto creado dentro de él (acabo de copiar originalto_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)
-
llame a esta función con su
SQLDatabase
instancia y el marco de datos que desea guardarto_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.