首页 > 解决方案 > 如何使用列名变量使用 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'

如何传递不带引号的列名?

标签: pythonsqlvariablespyodbc

解决方案


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]


推荐阅读