【问题标题】:bind pandas dataframe rows to sqlAlchemy custom query将 pandas 数据框行绑定到 sqlAlchemy 自定义查询
【发布时间】:2022-01-18 22:53:25
【问题描述】:

我在下面有一个名为table 的现有数据表:

column_a column_b column_c

  1         2       "r1"
  4         5       "r2"
  0         0       "r3"

我想用下面的熊猫数据框将数据更新为table

column_a column_b column_c

  7         8       "r1"
  9         10      "r2"

如何将值传递给查询中的参数 I 所以结果应该如下所示?

column_a column_b column_c

  7         8       "r1"
  9         10      "r2"
  0         0       "r3"

我只能设法在下面显示的 sqlAchemy 函数中手动输入值,我不知道如何使用 python 应用函数来应用熊猫数据框中的所有行。提前致谢!

我正在使用的 SqlAlchemy 自定义查询:

with engine.connect() as connection:
   connection.execute(text("UPDATE table SET column_a=:val1, column_b=:val2 WHERE column_c = :val3" ),
            {'val1': 7, 'val2': 8, 'val3': "r1"})

【问题讨论】:

    标签: python mysql pandas sqlalchemy apply


    【解决方案1】:

    像平常一样使用 upsert。

    conn =#Put here your database details
    
    df = pd.read_csv()#Read the pandas table
    df.to_sql('stagingTable', conn, if_exists='append', index = False)#Write pandas table as a staging table
    
    #SQL Query    
    sql = '''
    
    declare @TrackingTable table(Change varchar(30))
    MERGE TabletoUpdate  AS target
    USING stagingTable AS source
    ON (target.column_c = source.column_c)
    WHEN NOT MATCHED BY target 
       THEN  INSERT (column_c, column_b, column_a)  
             VALUES (source.column_c, source.column_b, source.column_a)
    WHEN MATCHED   
       THEN UPDATE SET 
            column_b      = source.column_b,
            column_a = source.column_a
    OUTPUT $action into @TrackingTable;
    COMMIT;
    select Change, count(*) impacted
    from @TrackingTable
    group by Change
    
    '''
    conn.execute(sql)
    

    【讨论】:

    • 我使用的是 mysql,而不是 transection-sql,但我想我明白了你的想法。我将尝试弄清楚如何在 mysql 查询中执行此操作。它应该使用我研究的INSERT with ON DUPLICATE KEY UPDATE
    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2020-11-03
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多