如何在熊猫数据框和SQL表之间进行内部联接?

时间:2019-06-27 08:52:41

标签: python pandas pyodbc

我正在尝试通过在我的服务器上本地计算的熊猫数据框与带有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完成吗?我查看了文档,找不到任何有用的信息。

1 个答案:

答案 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)

请确保?的顺序与数据元组的顺序相同。