将 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 自定义查询的主要内容,如果未能解决你的问题,请参考以下文章