在 python 中将文件夹位置作为 SQL 参数传递会导致错误
Passing a folder location as an SQL parameter in python causes an error
我是 python 的新手,我唯一知道的 SQL 来自这个项目,所以请原谅我缺乏技术知识:
def importFolder(self):
user = getuser()
filename = askopenfilename(title = "Choose an image from the folder to import", initialdir='C:/Users/%s' % user)
for i in range (0,len(filename) - 1):
if filename[-i] == "/":
folderLocation = filename[:len(filename) - i]
break
cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\dbsDetectorBookingSystem.accdb')
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM tblRuns")
cursor.execute("insert into tblRuns(RunID,RunFilePath,TotalAlphaCount,TotalBetaCount,TotalGammaCount) values (%s,%s,0,0,0)" %(str(self.runsCount + 1), folderLocation))
cnxn.commit()
self.runsCount = cursor.rowcount
rowString = str(self.runsCount) + " " + folderLocation + " " + str(0) + " " + str(0) + " " + str(0) + " " + str(0)
self.runsTreeView.insert("","end", text = "", values = (rowString))
这是我当前程序中的一个例程,旨在创建一个新记录,该记录除了索引和文件位置外大部分是空的。此位置需要保存为字符串,但是当它作为参数传递给 SQL 字符串时,会发生以下错误:
cursor.execute("insert into tblRuns(RunID,RunFilePath,TotalAlphaCount,TotalBetaCount,TotalGammaCount) values (%s,%s,0,0,0)" %(str(self.runsCount + 1), folderLocation))
ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'C:/Users/Jacob/Documents/USB backup'. (-3100) (SQLExecDirectW)")
我认为这是因为 SQL 识别文件路径并想要使用它。有人知道如何解决这个问题吗?
您没有正确使用 db-api。不要使用字符串格式来传递您的查询参数 - 这是 error-prone(正如您刚刚注意到的)和 security issue,您希望将它们作为参数传递给 cursor.execute()
,即:
sql = "insert into tblRuns(RunID, RunFilePath, TotalAlphaCount, TotalBetaCount, TotalGammaCount) values (%s, %s, 0, 0, 0)"
cursor.execute(sql, (self.runsCount + 1, folderLocation))
请注意,我们在这里不使用字符串格式(sql
和参数之间没有“%”)
注意:请注意,参数化查询的占位符取决于您的数据库连接器。 python-MySQLdb 使用 %
但您可以使用 ?
或其他任何东西。
wrt/ 你的确切问题:因为你没有在你的占位符周围加上引号,所以你发送的 sql 查询看起来像:
"insert into tblRuns(
RunID, RunFilePath,
TotalAlphaCount, TotalBetaCount, TotalGammaCount
)
values (1,/path/to/folder,0,0,0)"
这显然行不通(它需要 /path/to/folder
周围的引号才有效 SQL)。
通过以正确的方式传递查询参数,您的数据库连接器将处理所有引用和转义。
我是 python 的新手,我唯一知道的 SQL 来自这个项目,所以请原谅我缺乏技术知识:
def importFolder(self):
user = getuser()
filename = askopenfilename(title = "Choose an image from the folder to import", initialdir='C:/Users/%s' % user)
for i in range (0,len(filename) - 1):
if filename[-i] == "/":
folderLocation = filename[:len(filename) - i]
break
cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\dbsDetectorBookingSystem.accdb')
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM tblRuns")
cursor.execute("insert into tblRuns(RunID,RunFilePath,TotalAlphaCount,TotalBetaCount,TotalGammaCount) values (%s,%s,0,0,0)" %(str(self.runsCount + 1), folderLocation))
cnxn.commit()
self.runsCount = cursor.rowcount
rowString = str(self.runsCount) + " " + folderLocation + " " + str(0) + " " + str(0) + " " + str(0) + " " + str(0)
self.runsTreeView.insert("","end", text = "", values = (rowString))
这是我当前程序中的一个例程,旨在创建一个新记录,该记录除了索引和文件位置外大部分是空的。此位置需要保存为字符串,但是当它作为参数传递给 SQL 字符串时,会发生以下错误:
cursor.execute("insert into tblRuns(RunID,RunFilePath,TotalAlphaCount,TotalBetaCount,TotalGammaCount) values (%s,%s,0,0,0)" %(str(self.runsCount + 1), folderLocation))
ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'C:/Users/Jacob/Documents/USB backup'. (-3100) (SQLExecDirectW)")
我认为这是因为 SQL 识别文件路径并想要使用它。有人知道如何解决这个问题吗?
您没有正确使用 db-api。不要使用字符串格式来传递您的查询参数 - 这是 error-prone(正如您刚刚注意到的)和 security issue,您希望将它们作为参数传递给 cursor.execute()
,即:
sql = "insert into tblRuns(RunID, RunFilePath, TotalAlphaCount, TotalBetaCount, TotalGammaCount) values (%s, %s, 0, 0, 0)"
cursor.execute(sql, (self.runsCount + 1, folderLocation))
请注意,我们在这里不使用字符串格式(sql
和参数之间没有“%”)
注意:请注意,参数化查询的占位符取决于您的数据库连接器。 python-MySQLdb 使用 %
但您可以使用 ?
或其他任何东西。
wrt/ 你的确切问题:因为你没有在你的占位符周围加上引号,所以你发送的 sql 查询看起来像:
"insert into tblRuns(
RunID, RunFilePath,
TotalAlphaCount, TotalBetaCount, TotalGammaCount
)
values (1,/path/to/folder,0,0,0)"
这显然行不通(它需要 /path/to/folder
周围的引号才有效 SQL)。
通过以正确的方式传递查询参数,您的数据库连接器将处理所有引用和转义。