如何将参数传递给`pymssql`中的`cursor.execute`?

Posted

技术标签:

【中文标题】如何将参数传递给`pymssql`中的`cursor.execute`?【英文标题】:How can I pass parameters to `cursor.execute` in `pymssql`? 【发布时间】:2019-08-28 05:59:43 【问题描述】:

我正在通过pymssql 库连接到 sql server db。我正在尝试使用方法cursor.execute(sql, params) 来执行查询。

sql = """
            SELECT
                MIN(myDate)
            FROM
                %s
        """

上面定义了sql语句。它只是从表中选择最小的日期值。

当我运行下面的代码来传递参数时:

cursor.execute(sql, 'Daily')

我收到此错误pymssql.ProgrammingError: (102, b"Incorrect syntax near 'Daily'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")

不知参数应该如何传递给sql语句?

经过一些调试,我发现问题与表名有关。看起来我不能将表名放入参数中。我不想集中sql字符串的原因是为了避免sql注入。有没有办法将表名作为参数传递?

【问题讨论】:

这个cursor.execute(sql, ('Daily',))? 不,它不起作用。还是有语法错误 这不起作用。您不能将表或列名等文字作为参数传递。 psycopg2 PostgreSQL 驱动程序提供了一个特殊的包来安全地编写 SQL 字符串,但据我所知,没有其他驱动程序提供类似的东西。您必须自己仔细清理表名和列名,并通过字符串连接或插值将它们放入查询中。 【参考方案1】:

试试这个

sql = 'SELECT MIN(myDate) FROM %s'
cursor.execute(sql , ['Daily'])

【讨论】:

【参考方案2】:

您的查询可能包括\n

用空格替换\n(' ')

试试这个,

sql = """
            SELECT
                MIN(myDate)
            FROM
                %s
        """
cursor.execute(sql.replace('\n',' '), ('Daily',))

【讨论】:

我试过了,但没有帮助。同样的语法错误。 @ZhaoYi 能否请您在问题中添加完整的traceback

以上是关于如何将参数传递给`pymssql`中的`cursor.execute`?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给scala中的方法

如何将参数传递给 CloudFormation YAML 中的 Glue 作业?

如何将参数传递给SQL(Excel)中的查询

如何将参数传递给 Cucumber 中的@before 方法?

如何通过单击 PyQt 中的按钮将参数传递给函数?

如何将参数传递给 React js 中的函数?