psycopg2 将参数传递给 SQL 编程错误

Posted

技术标签:

【中文标题】psycopg2 将参数传递给 SQL 编程错误【英文标题】:psycopg2 pass arguments to SQL Programming Error 【发布时间】:2012-01-09 02:36:02 【问题描述】:

我尝试按照 docs 中描述的方式传递参数,但出现以下错误: 文件“slug_word.py”,第 100 行,在 get_col cur.execute("从 %s 中选择 %s" , data ) psycopg2.ProgrammingError:“E'catalog_category'”处或附近的语法错误 第 1 行:从 E'catalog_category' 中选择 E'slug'

以下是我的代码摘录:

def get_col(cxn, table, col):
    "fetch a column"
    cur = cxn.cursor()
    data = (col, table)
    cur.execute("select %s from %s" , data ) 
    rows = cur.fetchall()
    return rows

def main():

    cxn = connect('galleria')
    table = 'catalog_category'
    col = 'slug'
    rows = get_col(cxn, table, col)

【问题讨论】:

【参考方案1】:

通过重新阅读有关此问题的帖子Steve Holden,我发现在我的代码中参数必须以python方式传递:

 ..."select %s from %s" % data ) 

只有进入数据库的“真实”数据必须使用 psycopg2 参数方法,而不是表和列名之类的东西。 不幸的是,数据和表名的混合不起作用。

【讨论】:

【参考方案2】:

你可以使用AsIs psycopg2 函数:

Adapter 符合 ISQLQuote 协议,该协议适用于其对象 字符串表示已经作为 SQL 表示有效。

import psycopg2
from psycopg2.extensions import AsIs

def get_col(conn, table, col):
    '''Fetch a column'''

    QUERY = 'SELECT %(col)s from %(table)s'
    data = 'col': AsIs(col), 'table': AsIs(table)
    with conn.cursor() as cursor:
        cursor.execute(QUERY, data)
        rows = cursor.fetchall()        
    return rows

【讨论】:

以上是关于psycopg2 将参数传递给 SQL 编程错误的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给查询访问 VBA

使用 Mybatis 将布尔参数传递给存储过程

将参数传递给C#中的存储过程

如何将参数传递给 sql 'in' 语句?

psql 将参数传递给 sql 脚本

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