【问题标题】:PYODBC cursor to update the table in SQL databasePYODBC 游标更新 SQL 数据库中的表
【发布时间】:2016-06-01 14:38:44
【问题描述】:

下面是我的数据框的一个小样本

    In [121]: df
    Out[121]:
  TXN_KEY SEND_AGENT  PAY_AGENT
0  13273870  ANO080012  API352676
1  13274676  AUK359401  API352676
2  13274871  ACL000105  API352676
3  13275398  AED420319  API352676
4  13278566  ARA030210  API352676
5  13278955  AYM003098  API352676
6  13280334  AJ5020114  API352676
7  13280512  A11171047  API352676
8  13281278  AOG010045  API352676
9  13282118  AMX334165  API352676

我正在尝试使用 pyodbc 中的游标来使用数据框值更新 sql server 数据库中的表“结果”

cursor.execute("Update result set Pay_Agent = df['PAY_AGENT'][0] where Send_Agent = df['SEND_AGENT'][0]")

我得到以下错误:

 ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near ''PAY_AGENT''. (102) (SQLExecDirectW)")

但我确保数据类型在我的更新语句中正确匹配。

In [126]: type(df['PAY_AGENT'][0])
Out[126]: str

In [127]: type(df['SEND_AGENT'][0])
Out[127]: str

感谢任何见解。

【问题讨论】:

  • 使用参数将df 值传递给 SQL Server,而不是尝试将它们嵌入到更新语句中。有关详细信息,请参阅我的回答 here - 它引用了一个选择查询,但更新的步骤是相同的​​。
  • @Bryan 很难跟踪解决方案中用于传递给 df 的参数的确切位置。你能在我的例子中指出如何做到这一点吗?

标签: pandas pyodbc


【解决方案1】:

您必须使用参数正确格式化查询:

cursor.execute("Update result set Pay_Agent = ? where Send_Agent = ?", (df['PAY_AGENT'][0], df['SEND_AGENT'][0]))

在您使用的任何语言中,以这种方式使用绑定参数对于避免可能的 SQL 注入都很重要。祝你好运!

【讨论】:

  • 关于如何参数化 create 的任何想法:cursor.execute("""Create table result ? bigint Primary Key, ? varchar(9), ? varchar(9)""",x[0] ,x[1],x[2] ) x = df.columns.tolist() ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]'@ 附近的语法不正确P1'. (102) (SQLExecDirectW)")
猜你喜欢
  • 2018-05-18
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多