首页 > 解决方案 > 在 Django 中将 format() 函数与 pyodbc 一起使用时出现 SQL 错误

问题描述

我想在我的 Django 应用程序中使用 pyodbc 执行命令。当我对一列进行简单更新时,效果很好:

cursor.execute("UPDATE dbo.Table SET attr = 1 WHERE id = {}".format(id))

但是,当我尝试将字符串用作列值时,它会引发错误:

cursor.execute("UPDATE dbo.Table SET attr = 1, user = '{}' WHERE id = {}".format(id, str(request.user.username)))

这是错误消息:

('42S22', "[42S22] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Admin'. (207) (SQLExecDirectW)")

令人惊讶的是,这种方法有效:

cursor.execute("UPDATE dbo.Table SET attr = 1, user = 'Admin' WHERE id = {}".format(id))

似乎是什么问题?为什么 sql 将列值误认为其名称?

标签: sqldjangopyodbc

解决方案


如上所述,您的参数是倒置的,但如果您要使用cursor.execute(),更重要的事情是使用位置参数 ( %s)。这会将 SQL 和值分别传递给数据库后端,并保护您免受 SQL 注入:

from django.db import connection

cursor = connection.cursor()

cursor.execute("""
    UPDATE dbo.Table
    SET attr = 1,
        user = %s
    WHERE id = %s
""", [
    request.user.username,
    id,
])

推荐阅读