从excel在Python中组装用户生成的SQL服务器查询时要注意什么?

2024-10-02 06:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Excel作为用户在sqlserver表中创建、删除和更新条目的表单。然后我通过一个数据帧将这个输入带到Python中,并创建一个SQL字符串。然后通过pyodbc游标执行它。例如,下面是如何获得有效的功能更新查询。你知道吗

    ParamstoPass=len(ClassCheckMark.columns)
    L_Cols=list()
    L_Vals=list()
    tableName=ClassCheckMark[ClassCheckMark.columns[1]][0]
    SQL_Query='update ' + tableName + ' set '
    for i in range(2, ParamstoPass):
        L_Cols.append(ClassCheckMark[ClassCheckMark.columns[i]].name)
        L_Vals.append(ClassCheckMark[ClassCheckMark.columns[i]][0])

    for i in range(1, len(L_Cols)):
        SQL_Query=SQL_Query+'[' + L_Cols[i] +']=' +"'" + str(L_Vals[i]) +"', "

    SQL_Query=SQL_Query[:-2]+' where ID=' + "'" + str(L_Vals[0]) +"'"
    cursor.execute(SQL_Query)
    cnn.commit()
    cnn.close()

但我知道用户可以在Excel中输入一些不需要的字符,然后将其输入到查询中。你知道吗

那么在python中验证SQL字符串的最佳方法是什么呢?我应该查找像“\”、“\0”、“\n”、“\r”、“'”、“'”、“\x1a”这样的特定字符吗?或者,实现这一目标的最佳行业方法是什么?你知道吗

我意识到,一般来说,这不是实现用户与数据库交互的最佳方法,但由于各种限制,我将采用这种方法。你知道吗

谢谢你。你知道吗


Tags: columns方法字符串用户forsqllenquery
1条回答
网友
1楼 · 发布于 2024-10-02 06:22:42

在构建L_ColsL_Vals列表之后,我建议根据表元数据验证列名,构造一个参数化SQL命令,然后执行它。例如:

# test data
L_Cols = ['ID', 'FirstName', 'Photo']
L_Vals = [123, 'bob', None]
tablename = "People"

# validate list of column names
valid_column_names = [x.column_name for x in cursor.columns(tablename).fetchall()]
for col_name in L_Cols:
    if col_name not in valid_column_names:
        raise ValueError("[{0}] is not a valid column name for table [{1}]".format(col_name, tablename))
# build SQL command text
SQL_Query = "UPDATE [" + tablename + "] SET "
SQL_Query += ", ".join("[" + x + "]=?" for x in L_Cols[1:])
SQL_Query += " WHERE [" + L_Cols[0] + "]=?"
print(SQL_Query)  # UPDATE [People] SET [FirstName]=?, [Photo]=? WHERE [ID]=?
# move ID value to the end of the list of parameters
params = L_Vals[1:] + L_Vals[0:1]
print(params)  # ['bob', None, 123]

# (edit by OP)
# as in my case, some elements were of unicode markup, which threw
#   ProgrammingError: ('Invalid parameter type.  param-index=0 
#   param-type=numpy.int64', 'HY105'). 
# May need to add params=[str(x) for x in params]

cursor.execute(SQL_Query, params)

相关问题 更多 >

    热门问题