psycopg2 передает аргументы в ошибку программирования SQL - PullRequest
0 голосов
/ 09 января 2012

Я пытался передать параметры так, как это описано в документации , но я получаю следующую ошибку: Файл "slug_word.py", строка 100, в get_col cur.execute ("выберите% s из% s", данные) psycopg2.ProgrammingError: синтаксическая ошибка в или около «E'catalog_category» ЛИНИЯ 1: выберите E'slug 'из E'catalog_category'

Вот выдержки из моего кода:

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)

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Перечитав пост Стив Холден об этой проблеме, я обнаружил подсказку, что в моем коде параметры должны быть переданы через python:

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

Только «реальные» данные, которые поступают в базу данных, должны использовать метод параметра psycopg2, а не такие вещи, как имена таблиц и столбцов. К сожалению, смешивание данных и имени таблицы не работает.

1 голос
/ 06 февраля 2018

Вы можете использовать AsIs Функция psycopg2:

Адаптер соответствует протоколу 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
...