【问题标题】:How to perform an SQL query with PYODBC using a column name variable?如何使用列名变量使用 PYODBC 执行 SQL 查询?
【发布时间】:2021-03-18 05:24:37
【问题描述】:

我已经编写了几个函数来获取特定的数据项,如下所示:

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

execute 语句使用单引号传递part_num(字符串)的值,这是正确的。当列名变量var = 'impShortDescription' 生成的SQL 是有效的SELECT 'impShortDescription'... 所以返回的项目是

('impShortDescription', )

所以getattr(self.cursor.fetchone(), var) 导致错误

AttributeError: 'pyodbc.Row' object has no attribute 'impShortDescription'

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

【问题讨论】:

    标签: python sql variables pyodbc


    【解决方案1】:

    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]
    
    

    【讨论】:

    • 谢谢@Tim Roberts。注意到用户数据问题。
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多