将 pandas 数据框行绑定到 sqlAlchemy 自定义查询

Posted

技术标签:

【中文标题】将 pandas 数据框行绑定到 sqlAlchemy 自定义查询【英文标题】:bind pandas dataframe rows to sqlAlchemy custom query 【发布时间】: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")

【问题讨论】:

【参考方案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

以上是关于将 pandas 数据框行绑定到 sqlAlchemy 自定义查询的主要内容,如果未能解决你的问题,请参考以下文章

Python、Pandas 和 for 循环:根据与列表值的匹配填充数据框行

根据“小时”日期时间选择 Pandas 数据框行

以整数形式获取 pandas 数据框行的索引

选择两个日期之间的 Pandas 数据框行

Pandas - 格式化数据框行不起作用

Python Pandas 数据框行条目不能按条件进行比较