在 pypyodbc 的 SQL 字符串中转义字符

Escaping characters in SQL string for pypyodbc

假设我在 SQL 服务器中有 my_table 这样的:

  CREATE TABLE my_table
  (col1 VARCHAR(100),
  col2 VARCHAR(100),
  col3 INT)

我尝试使用 Python 3.5 和 pypyodbc 库向 table 插入一些记录,如下所示:

import pypyodbc
connection = pypyodbc.connect('Driver={SQL Server};' 'Server=12.3.456.789.0123;' 'Database=mydb;' 'uid=me;pwd=mypwd')
cursor= connection.cursor()
data = [{'p1': "I'm hungry", 'p2': "text for col2", 'p3': '1234'}]
for dd in data:
    insert_sql = "INSERT INTO my_table (col1,col2,col3) VALUES (%s, %s, %s)"
    cursor.execute(insert_sql, (dd['p1'], dd['p2'], dd['p3']))

但是当上面的代码是运行时,它returns:

pypyodbc.ProgrammingError: ('HY000', 'The SQL contains 0 parameter markers, but 3 parameters were supplied')

我不知道我做错了什么。如果有人能帮我解决这个问题,我将不胜感激!

这里的问题是您正在使用 python 或其他编程语言中的 %s 占位符。然而 pypyodbc 使用 ?作为占位符(参数标记)。只需将 %s 替换为 ?,您的代码应该可以正常工作。

import pypyodbc
connection = pypyodbc.connect('Driver={SQL Server};' 'Server=12.3.456.789.0123;' 'Database=mydb;' 'uid=BenchmarkingUS;pwd=mypwd')
cursor= connection.cursor()
data = [{'p1': "I'm hungry", 'p2': "text for col2", 'p3': 1234}]
for dd in data:
    insert_sql = "INSERT INTO phyo_test (col1,col2,col3) VALUES (?, ?, ?)"
    cursor.execute(insert_sql, (dd['p1'], dd['p2'], dd['p3']))
cursor.commit()

注意:您将 p3 的值设置为不会出错的字符串“1234”。不过还是改成int 1234比较好,防止数据类型错误。