Pyodbc游标循环遍历数据帧并插入sql

时间:2016-06-02 15:28:07

标签: python sql-server-2008 pandas dataframe pyodbc

下面是我的SQL TABLE和DATAFRAME:

    TXN_KEY SEND_AGENT  Pay_Agent
13273870    ANO080012   NULL
13274676    AUK359401   NULL
13274871    ACL000105   NULL
13275398    AED420319   NULL
13278566    ARA030210   NULL
13278955    AYM003098   NULL
13280334    AJ5020114   NULL
13280512    A11171047   NULL
13281278    AOG010045   NULL
13282118    AMX334165   NULL

In [212]: df
Out[212]:
TXN_KEY SEND_AGENT  PAY_AGENT
13273870  ANO080012  API352676
13274676  AUK359401  AED002782
13274871  ACL000105  ACB020203
13275398  AED420319  ASE094882
13278566  ARA030210  AII071196
13278955  AYM003098  AHX012817
13280334  AJ5020114  AED000438
13280512  A11171047  AEL051943
13281278  AOG010045  ADJ031448
13282118  AMX334165  APM033226

下面的游标语句是在sql server中添加Pay_Agent的第一个值就好了

    cursor.execute("""update result SET Pay_Agent = ? WHERE SEND_AGENT = ?""",df['PAY_AGENT'][0],df['SEND_AGENT'][0])

13273870    ANO080012   API352676
13274676    AUK359401   NULL
13274871    ACL000105   NULL
13275398    AED420319   NULL
-------

如何在for循环中编码此游标语句以迭代整个数据帧并将值发布到SQL服务器。

2 个答案:

答案 0 :(得分:2)

我建议采用不同的方式:

df保存为SQL Server表(让我们说:tmp_result

df.to_sql('tmp_result', conn, if_exists='replace')

然后按如下方式更新您的表:

update result 
  set result.Pay_Agent = tmp_result.Pay_Agent
FROM result
INNER JOIN tmp_result
  on result.SEND_AGENT = tmp_result.SEND_AGENT;

这样您就可以在不循环的情况下实现目标

答案 1 :(得分:0)

以下是循环数据框的方法:

$curl = curl_init( 'https://ipnpb.paypal.com/cgi-bin/webscr' );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $req );
$response = curl_exec( $curl );

if( 'VERIFIED' == trim( $response ) ) {
  // IPN verified by PayPal
}

我相信这会帮助其他人尝试实现同样目标。