sql - 在 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 将列值误认为其名称?
解决方案
如上所述,您的参数是倒置的,但如果您要使用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,
])
推荐阅读
- c# - 如何通过oracle在c#中使用多个选择查询
- powerbi - 在 Power BI 中计算会话的持续时间
- python - 在 groupby 内循环并更改每个组的第一行
- php - WordPress WP_Query 结果未按日期正确排序?
- javascript - 在用作另一个函数中的回调函数之前,函数不会完全初始化
- apache-kafka - 使用 Java 查找 Kafka 主题中的消息数
- java - 带有@Transactional 的EntityManager persist() 不会抛出DataIntegrityViolationException
- sql - 如何在遍历 300M + 记录并将该信息插入另一个表时获取每天的第一条和最后一条记录的 PKId?
- java - 获取异常是否为 instanceof 而不使用 instanceof 的复杂方法
- c++ - 如何使用 C++ 将数组按字母顺序排序到新数组中?