要执行的第一个参数必须是字符串或Unicode查询
问题内容:
我正在尝试使用pyodbc将blob数据上传到ms-sql db。我得到 “要执行的第一个参数必须是字符串或Unicode查询” 错误。
该代码是
file = pyodbc.Binary(open("some_pdf_file.pdf", "r").read())
cur.execute("INSERT INTO BlobDataForPDF(ObjectID, FileData, Extension) VALUES ('1', " + file + ", '.PDF')")
cur.commit()
第一个参数ObjectID作为字符串发送。我没发现任何问题,但我有什么遗漏吗?
问题答案:
使用参数化插入:
file = pyodbc.Binary(open("some_pdf_file.pdf", "r").read())
sql = "insert into BlobDataForPDF(ObjectID, FileData, Extension) values (?, ?, ?)"
cur.execute(sql, ('1', file, '.PDF'))
cur.commit()
当前代码正在尝试将二进制数据与您的插入字符串连接在一起。使用参数可以将SQL字符串与插入的值隔离开,从而防止SQL注入,并且如果您多次使用不同的值执行插入操作,则效率更高。示例用法在这里。