python - 如何使用列名变量使用 PYODBC 执行 SQL 查询?
问题描述
我编写了几个函数来获取特定的数据项,如下所示:
def get_short_desc(self, part_num):
sql = 'SELECT impShortDescription FROM Parts '
sql += 'WHERE impPartID LIKE ?'
self.cursor.execute(sql, [part_num])
item = self.cursor.fetchone().impShortDescription
return item
我想参数化这些功能,所以我不会重复自己(DRY):
def get_part_entry_item(self, var, part_num):
sql = 'SELECT ? FROM Parts '
sql += 'WHERE impPartID LIKE ?'
self.cursor.execute(sql, [var, part_num])
item = getattr(self.cursor.fetchone(), var)
return item
part_num
执行语句使用单引号传递(字符串)的值,这是正确的。当列名变量var = 'impShortDescription'
产生的 SQL 是有效 SELECT 'impShortDescription'...
的所以返回的项目是
('impShortDescription', )
所以getattr(self.cursor.fetchone(), var)
导致错误
AttributeError: 'pyodbc.Row' object has no attribute 'impShortDescription'
如何传递不带引号的列名?
解决方案
SQL 替换仅适用于值,而不适用于表或字段名称。做这个。是的,这意味着您必须小心不要将用户数据作为字段名称传递。
def get_part_entry_item(self, var, part_num):
sql = f'SELECT {var} FROM Parts '
sql += 'WHERE impPartID LIKE ?'
self.cursor.execute(sql, (part_num,))
return self.cursor.fetchone()[var]
推荐阅读
- ios - 在终端中尝试“xcodebuild 存档”时存档失败
- javascript - 如何在 HTML 中保存状态?
- java - 从具有另一个对象数组列表属性的对象数组列表中获取值
- python - 转换图像时出现错误权限 13
- javascript - 图像未出现在游戏移相器中
- r - 使用 : 或 . 在 R 中的 lm() 中输入所有预测变量或使用点 (.) 产生相同的统计信息?
- java - 如何在 Drools 中运行 .scesim 文件?甚至可以在 Drools 中运行吗?
- java - 如何创建特定于某个目录的 IntellijIDEA 代码模板
- javascript - 使用 columnDefs 的 dataTable 不起作用,如果使用它来隐藏特定的列和数据,然后将其隐藏的数据传递给数据库
- flutter - 比较 dart/flutter 中的 svg 文件