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 шт):
Здравствуй! Не уверен, что лучшее решение, но лично я просто делаю кавычки перед и после строковой переменной в запросе. В вашем случае, это примерно так:
cursor.execute(f'SELECT * FROM users WHERE username = "{username}" ')
Спустя много часов гуглёшки, нашёл решение своей проблемы.
Помогла функция 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