【问题标题】:How to inner join between pandas dataframe and SQL table?如何在 pandas 数据框和 SQL 表之间进行内连接?
【发布时间】:2019-06-27 08:52:41
【问题描述】:

我正在尝试通过在我的服务器上本地计算的 pandas 数据帧和使用 pyodbc 的远程服务器中的 SQL 表之间的内部连接来更新 SQL 表,但我似乎无法匹配键在数据框/表之间。

我的第一种方法是创建一个简单的查询,在其中更新我需要的 3 列,使用数据帧中的列和 SQL 表中的列之间的内连接。但是很可惜,它没有用,因为我受到了

的欢迎

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完成吗?我查看了文档,找不到任何有用的信息。

【问题讨论】:

    标签: python pandas pyodbc


    【解决方案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)
    

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

    【讨论】:

    • 非常感谢!除了设置非键列的值时的最后一个逗号之外,在 FROM 之前,它就像一个魅力!
    • @MárcioCoelho 是的,你是对的。这是一个错字。我刚刚纠正了它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多