Ошибка инструкции обновления PostgreSQL, несмотря на чтение документации

#python #postgresql #psycopg2

#python #postgresql #psycopg2

Вопрос:

Я пытаюсь обновить массив в массиве в столбце. Однако psycopg2 продолжает выдавать ошибки, и я понятия не имею, почему это утверждение выдает подобные ошибки.

Код:

 lastUpload = "tgpx60236wa"
print(search.execute()["items"][0]["contentDetails"]["upload"]["videoId"])
connect = psycopg2.connect(host = loadConfig()["host"], database = loadConfig()["database"], user = loadConfig()["user"], password = loadConfig()["password"])
cursor = connect.cursor()
cursor.execute(f"SELECT youtube_channels[{channels.index(channel)}][1] FROM youtubeChannels WHERE guild_id = {guild[0]}")
print(cursor.fetchone()[0])
cursor.execute(f"UPDATE youtubeChannels SET youtube_channels[{channels.index(channel)}] = {lastUpload} WHERE guild_id = {guild[0]} RETURNING youtube_channels;")
connect.commit()
print(cursor.fetchone()[0])
cursor.close()
connect.close()
  

Вывод:

 cursor.execute(f"UPDATE youtubeChannels SET youtube_channels[{channels.index(channel)}] = {lastUpload} WHERE guild_id = {guild[0]} RETURNING youtube_channels;")
psycopg2.errors.UndefinedColumn: column "tgpx60236wa" does not exist
LINE 1: UPDATE youtubeChannels SET youtube_channels[0] = tgpx60236wa...
  

Я даже не знаю, что должна означать эта ошибка, но я просто не знаю, что я здесь делаю не так.

Комментарии:

1. Большинству людей не нравится горизонтальная прокрутка.

2. Прямо сейчас вам, похоже, не хватает одинарных кавычек в запросе вокруг {lastUpload} . Вы должны использовать подготовленные инструкции, чтобы вам больше не нужно было беспокоиться об этом.

Ответ №1:

Это потому, что вы не должны сообщать параметры в запросах psycopg2 с использованием f-строк. Параметры запроса должны передаваться в качестве аргументов execute метода и использовать заполнители для замены, что-то вроде этого:

 lastUpload = "tgpx60236wa"
print(search.execute()["items"][0]["contentDetails"]["upload"]["videoId"])
connect = psycopg2.connect(host = loadConfig()["host"], database = loadConfig()["database"], user = loadConfig()["user"], password = loadConfig()["password"])
cursor = connect.cursor()
cursor.execute("SELECT youtube_channels[%s][1] FROM youtubeChannels WHERE guild_id = %s", channels.index(channel), guild[0])
print(cursor.fetchone()[0])
cursor.execute("UPDATE youtubeChannels SET youtube_channels[%s] = %s WHERE guild_id = %s RETURNING youtube_channels;", channels.index(channel), lastUpload, guild[0])
connect.commit()
print(cursor.fetchone()[0])
cursor.close()
connect.close()
  

Обратите внимание, что это не единственный способ передать параметры sql-запросу. Я предлагаю вам углубиться в документацию, чтобы лучше понять.