Postgresql: вставка значения столбца из файла
Например, существует таблица с именем testtable, которая имеет следующие столбцы: testint (integer) и testtext (varchar (30)).
Что я хочу сделать, это примерно что-то вроде этого:
INSERT INTO testtable VALUES(15, CONTENT_OF_FILE('file'));
При чтении документации postgresql все, что я могу найти, это команда COPY TO/FROM, но она применяется к таблицам, а не к отдельным столбцам.
Итак, что мне делать?
Ответы
Ответ 1
Если этот код SQL выполняется динамически с вашего языка программирования, используйте средства этого языка для чтения файла и выполните простой оператор INSERT.
Однако, если этот код SQL предназначен для выполнения с помощью инструмента командной строки psql
, вы можете использовать следующую конструкцию:
\set content `cat file`
INSERT INTO testtable VALUES(15, :'content');
Обратите внимание, что этот синтаксис специфичен для psql
и использует команду оболочки cat
.
Это подробно объясняется в руководстве PostgreSQL:
Ответ 2
Если я правильно понимаю ваш вопрос, вы можете прочитать одну строку (строки) в таблице temp и использовать ее для вставки:
DROP SCHEMA str CASCADE;
CREATE SCHEMA str;
SET search_path='str';
CREATE TABLE strings
( string_id INTEGER PRIMARY KEY
, the_string varchar
);
CREATE TEMP TABLE string_only
( the_string varchar
);
COPY string_only(the_string)
FROM '/tmp/string'
;
INSERT INTO strings(string_id,the_string)
SELECT 5, t.the_string
FROM string_only t
;
SELECT * FROM strings;
Результат:
NOTICE: drop cascades to table str.strings
DROP SCHEMA
CREATE SCHEMA
SET
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "strings_pkey" for table "strings"
CREATE TABLE
CREATE TABLE
COPY 1
INSERT 0 1
string_id | the_string
-----------+---------------------
5 | this is the content
(1 row)
Обратите внимание, что файл "рассматривается" сервером, поскольку сервер видит файловую систему. "Текущий каталог" с этой точки зрения, вероятно, $PG_DATA, но вы ничего не должны принимать и укажите полное имя пути , которое должно быть доступно для чтения и чтения сервером. Вот почему я использовал '/tmp', который является небезопасным (но отличная точка rendez-vous; -)