Psycopg2 неправильно выполняет SELECT * FROM table WHERE column = {data}

Пишу Telegram-бота на Python с использованием PostgreSQL для хранения данных. Имеется две функции для получения пользователя из базы: 1 - по его user_id; 2 - по его username. Первая функция ( по user_id ) работает прекрасно, без ошибок, вторая же делает, что-то не так.

Первая функция ( по user_id ):

def db_get_user_userid(user_id):
    cursor.execute(f'SELECT * FROM users WHERE user_id = {user_id}')
    user = cursor.fetchone()

    user_id = user[1]
    username = user[2]
    admin = user[3]
    add_date = user[4]

    return user_id, username, admin, add_date

Вторая функция ( по username ):

def db_get_user_username(username):
    cursor.execute(f'SELECT * FROM users WHERE username = {username}')
    user = cursor.fetchone()

    user_id = user[1]
    username = user[2]
    admin = user[3]
    add_date = user[4]

    return user_id, username, admin, add_date

Проблема со второй функцией заключается в том, что psycopg2 почему-то считает подставляемый username названием колонки, когда в первой функции с user_id всё работает нормально.

Вывод в консоли:

column "beirym" does not exist
LINE 1: SELECT * FROM users WHERE username = Beirym

Также пробовал менять SQL-запрос на вот такой:

def db_get_user_username(username):
    cursor.execute('SELECT * FROM users WHERE username = %s', (username, ))
    user = cursor.fetchone()

    user_id = user[1]
    username = user[2]
    admin = user[3]
    add_date = user[4]

    return user_id, username, admin, add_date

Но и это не помогло, psycopg2 всё-равно считает передаваемый {username} названием колонки в таблице.

Несколько часов искал информацию в гугле, но так ничего и не нашёл. Надеюсь на помощь, спасибо!


Ответы (2 шт):

Автор решения: Sasonit

Здравствуй! Не уверен, что лучшее решение, но лично я просто делаю кавычки перед и после строковой переменной в запросе. В вашем случае, это примерно так:

cursor.execute(f'SELECT * FROM users WHERE username = "{username}" ')
→ Ссылка
Автор решения: Beirym

Спустя много часов гуглёшки, нашёл решение своей проблемы.

Помогла функция AsIs() из модуля psycopg2.extensions.

Код теперь выглядит так:

import psycopg2
from psycopg2.extensions import AsIs

def db_get_user_username(username):

    cursor.execute('SELECT * FROM users WHERE %s = %s', (AsIs('username'), username))
    user = cursor.fetchone()

    user_id = user[1]
    username = user[2]
    admin = user[3]
    add_date = user[4]

    return user_id, username, admin, add_date
→ Ссылка