Запрос к базе данных postgreSQL - PullRequest
0 голосов
/ 12 января 2019

Добрый день, изучаю библиотеку для работы с postgresql из python, написано в описании:

Никогда, никогда, НИКОГДА не используйте конкатенацию строк Python (+) или интерполяцию строковых параметров (%) для передачи переменных в строку запроса SQL. Даже под дулом пистолета.

Я хочу вывести из таблицы reports, столбцы object, data Я попытался сделать такую ​​функцию:

def select(self, column, table):
    with conn.cursor() as cursor:
        stmt = sql.SQL('SELECT {} FROM {}').format(
            sql.Identifier(column),
            sql.Identifier(table))
        cursor.execute(stmt)
        for row in cursor:
            print(row)

Но я получаю ошибку:

psycopg2.ProgrammingError: column "object, data" does not exist
LINE 1: SELECT "object, data" FROM "object"

Мне удалось добиться желаемого результата с помощью функции:

def select(self, column, table):
    with conn.cursor() as cursor:
        cursor.execute("SELECT %s FROM %s" %(column,table))
        return cursor.fetchall()

Подскажите, пожалуйста, как сделать функцию без использования %s?

1 Ответ

0 голосов
/ 12 января 2019

Вместо передачи строковых столбцов у вас должен быть список имен столбцов, которые вы хотите передать. Теперь вы можете использовать sql.SQL(', ').join(), чтобы присоединиться к ним.

def select(self, columns, table):
    with conn.cursor() as cursor:
        stmt = sql.SQL('SELECT {} FROM {}').format(
            sql.SQL(', ').join(sql.Identifier(n) for n in columns),
            sql.Identifier(table))
        cursor.execute(stmt)
        for row in cursor:
            print(row)
...