我正在尝试通过在我的服务器上本地计算的熊猫数据框与带有pyodbc的远程服务器中的SQL表之间的内部联接来更新SQL表,但是我似乎无法匹配键在数据框/表之间。
我的第一种方法是创建一个简单的查询,在其中更新我需要的3列,方法是使用数据帧中的列与SQL表中的列之间的内部联接。但是a,它没用,因为我受到
的欢迎在pydobc中使用的查询是:
'UPDATE table1
SET table1.col1 = ' + df[col1] + ', ' +
'table1.col2 = ' + df[col2] + ', ' +
'table1.col3 = ' + df[col3] +
' FROM table1 ' +
' inner join ' + df[key_col] + ' on ' + df[key_col] + '= table1.key_col'
哪个返回错误:
TypeError: The first argument to execute must be a string or unicode query.
我的第二种方法是使用循环并遍历数据帧的每一行,在数据帧和SQL表之间连续匹配:
SET table1.col1 = df[col1],
table1.col2 = df[col2],
table1.col3 = df[col3]
FROM table1
WHERE table1.key_col = df[key_col]
但是,由于数据帧的大小,匹配它们之间的所有行最多需要一个小时。
我的预期结果是表1中三列的更新,但实际上没有任何更新。
我当前的解决方案是使用所需的列和键在SQL中创建新表,然后通过另一个查询在两个SQL表之间进行内部联接,但这是一个临时解决方案。
可以用pyodbc完成吗?我查看了文档,找不到任何有用的信息。
答案 0 :(得分:1)
data = [tuple(x) for x in df.values]
cnxn = open_connection() # open the connection
crsr = cnxn.cursor()
crsr.fast_executemany = True # If you want it to run fast, but it will consume more memory
sql_string = """
UPDATE table1
SET
table1.col1 = ?,
table1.col2 = ?,
table1.col3 = ?
FROM
table1
WHERE
table1.key_col = ?
"""
crsr.executemany(sql_string, data)
请确保?
的顺序与数据元组的顺序相同。