Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

162
Vistas
¿Cuál es la forma correcta de actualizar una columna orm slqalchemy desde una columna de marco de datos de pandas?

Cargué algunos datos y modifiqué una columna en el marco de datos y me gustaría actualizar la base de datos para reflejar los cambios.

Lo intenté:

db.session.query(sqlTableName).update({sqlTableName.sql_col_name: pdDataframe.pd_col_name})

Pero eso simplemente eliminó la columna en la base de datos (establezca cada valor en '0', el valor predeterminado). Probé algunos otros formatos de datos sin suerte. Supongo que está pasando algo extraño con los tipos de datos que mezclé, o simplemente no se le permite actualizar una columna con una variable como esta directamente.

Podría hacer esto con un bucle pero... eso sería realmente horrible. Perdón por la pregunta básica, después de un largo descanso de un proyecto, mi comprensión de la sqlalchemy ciertamente ha disminuido.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Para cargar el DataFrame en una tabla temporal y luego realizar una ACTUALIZACIÓN, no necesita escribir el SQL usted mismo, puede hacer que SQLAlchemy Core lo haga por usted:

 import pandas as pd import sqlalchemy as sa def update_table_columns_from_df(engine, df, table_name, cols_to_update): metadata = sa.MetaData() main_table = sa.Table(table_name, metadata, autoload_with=engine) pk_columns = [x.name for x in main_table.primary_key.columns] df.to_sql("temp_table", engine, index=False, if_exists="replace") temp_table = sa.Table("temp_table", metadata, autoload_with=engine) with engine.begin() as conn: values_clause = {x: temp_table.columns[x] for x in cols_to_update} where_clause = sa.and_( main_table.columns[x] == temp_table.columns[x] for x in pk_columns ) conn.execute( main_table.update().values(values_clause).where(where_clause) ) temp_table.drop(engine) if __name__ == "__main__": test_engine = sa.create_engine( "postgresql+psycopg2://scott:tiger@192.168.0.199/test", echo=True, # (for demonstration purposes) ) with test_engine.begin() as test_conn: test_conn.exec_driver_sql("DROP TABLE IF EXISTS main_table") test_conn.exec_driver_sql( """\ CREATE TABLE main_table ( id1 integer NOT NULL, id2 integer NOT NULL, txt1 varchar(50), txt2 varchar(50), CONSTRAINT main_table_pkey PRIMARY KEY (id1, id2) ) """ ) test_conn.exec_driver_sql( """\ INSERT INTO main_table (id1, id2, txt1, txt2) VALUES (1, 1, 'foo', 'x'), (1, 2, 'bar', 'y'), (1, 3, 'baz', 'z') """ ) df_updates = pd.DataFrame( [ (1, 1, "new_foo", "new_x"), (1, 3, "new_baz", "new_z"), ], columns=["id1", "id2", "txt1", "txt2"], ) update_table_columns_from_df( test_engine, df_updates, "main_table", ["txt1", "txt2"] ) """SQL emitted: UPDATE main_table SET txt1=temp_table.txt1, txt2=temp_table.txt2 FROM temp_table WHERE main_table.id1 = temp_table.id1 AND main_table.id2 = temp_table.id2 """ df_result = pd.read_sql_query( "SELECT * FROM main_table ORDER BY id1, id2", test_engine ) print(df_result) """ id1 id2 txt1 txt2 0 1 1 new_foo new_x 1 1 2 bar y 2 1 3 new_baz new_z """
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda