postgresql обновляет поле bytea изображением с рабочего стола
Я пытаюсь написать обновление SQL-оператора в Postgresql (pg Commander), который будет обновлять столбец изображения профиля пользователя
Я пробовал это:
update mytable set avatarImg = pg_read_file('/Users/myUser/profile.png')::bytea where userid=5;
получил ERROR: absolute path not allowed
2 ответа
- Прочитайте файл в клиенте.
- Избегайте содержимого как bytea.
- Вставьте в базу данных как обычно.
(Разработка правильного, но краткого ответа Ричарда; его следует пометить как правильный):
pg_read_file
на самом деле предназначен только в качестве административного инструмента и в соответствии с руководством:
Функции, показанные в Таблице 9-72, обеспечивают собственный доступ к файлам на компьютере, на котором размещен сервер. Только файлы в каталоге кластера базы данных и log_directory могут быть доступны.
Даже если это ограничение не применяется, используя pg_read_file
было бы неправильно; вам придется использовать pg_read_binary_file
, Вы не можете просто читать text
и бросить в bytea
как это.
Ограничения пути означают, что вы должны прочитать файл, используя клиентское приложение, как говорит Ричард. Прочитайте файл с клиента, установите его как bytea
поместите параметр в ваш SQL и отправьте запрос.
Вы также можете использовать lo_import
чтобы прочитать файл на стороне сервера в виде большого двоичного объекта, а затем прочитать его как bytea
и удалите двоичный большой объект.
pg_read_file может читать файлы только из пути к каталогу данных, если вы хотите знать, как использовать путь к каталогу данных:
SHOW data_directory;
Например, это покажет,
/var/lib/postgresql/data
Скопируйте файл в указанную директорию. После вы можете использовать только имя файла в вашем запросе.
UPDATE student_card SET student_image = pg_read_file('up.jpg')::bytea;
или можете использовать функцию pg_read_binary_file.
UPDATE student_card SET student_image = pg_read_binary_file('up.jpg')::bytea;