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; -)