【问题标题】:Syntax error near cursor.execute() during insert into [closed]插入 [关闭] 期间 cursor.execute() 附近的语法错误
【发布时间】:2021-10-23 03:09:51
【问题描述】:

我在cursor.execute() 收到一个错误,我不知道为什么。

for index, row in bc_df.iterrows():
  cursor.execute(f'''INSERT INTO test.dbo.controller( first_name, middle_initial, last_name, )VALUES({row['first_name']},{row['middle_initial']},{row['last_name']})''')

错误信息:

[ERROR] ProgrammingError: (102, b"'\'.DB-Lib 错误消息 20018 附近的语法不正确,严重性 15:\n一般 SQL Server 错误:检查来自 SQL Server 的消息\n") Traceback(最近一次调用最后一次):

不知道错过了什么

【问题讨论】:

  • 好吧,INSERT ... ( ... , last_name, ) 永远不会起作用,结尾的逗号会使 SQL Server 的解析器出现问题。

标签: python sql-server pymssql


【解决方案1】:

字符串值必须加引号。为了避免 SQL 注入攻击,聪明的方法是让 SQL 连接器来做:

  cursor.execute('INSERT INTO test.dbo.controller(first_name, middle_initial, last_name) VALUES (?,?,?);', (row['first_name'],row['middle_initial'],row['last_name']) )

某些连接器允许您使用类似于 f 字符串的语法,因此您可以只传递 row。这取决于哪个数据库和哪个连接器。

【讨论】:

  • 这是正确的答案,但有一个误解。这不是驱动程序实际执行的方式,至少对于 SQL Server 而言。它不会将参数引用到实际的查询文本中,而是完全分开传递它们,并将它们直接插入到编译的执行树中。
  • 我不明白这有什么关系。这是一个实现细节。
  • 这不仅仅是一个实现细节。像这样的误解会让人们写像SELECT * FROM @tableName 或WHERE SomeCol IN (@CommaSeparatedValues) 这样的东西,一旦你意识到实际发生的事情,这显然是行不通的
  • 您的 WHERE 子句确实适用于许多 SQL 连接器。
  • 我说我专门指的是 SQL Server,由 OP 标记,它不支持这一点。无论哪种方式,我的观点是,它不仅仅是插入查询中的一段文本,它是一个占位符,一直进入编译树。
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多