\copy
c ommand. Эта команда предназначена для импорта данных из файлов.
\copy my_table from my_file.txt DELIMITER ' '
Это просто, но Postgres довольно строг - он не требует пустой строки в конце и ровно один пробела между полями.
Примечание: ваши данные несовместимы - первая строка содержит пробел между полями.
Обратно к вашему примеру. Это должно быть медленно. Вы импортируете в одну строку - для каждой строки вы начинаете psql и там транзакция. Использование опции pipe и single transaction должно быть намного быстрее. С awk
вы можете генерировать SQL скрипт:
cat my_file.txt | \
awk -F" " -v Q="'" '{print "INSERT INTO my_table VALUES(" Q$1Q " , " Q$2Q ");" }' | \
psql postgres -1
Но есть риск возможного недостающего сбежавшего апострофа в данных (он же безопасное, как ваш медленным раствор). COPY
решение должно быть намного лучше и на 100% безопасно. Он обеспечивает все необходимое для выхода изнутри.
testdb=> \set content '''' `cat my_file.txt` ''''
testdb=> INSERT INTO my_table VALUES (:content);
Это не должно работать. Операторы SQL в psql
не поддерживают массовые операции над массивом (например, ODBC). Результатом вашего примера является некорректная команда INSERT. Переменные сеанса оцениваются как замена строк. Вы отправляете заявление на сервер, например:
INSERT INTO my_table VALUES ('Jameson','aa',
'david','bb',
'pitter','cc'
...)
И это неверно.
My_file не имеет пустой строки и был устроен точно так же, как и образец редактирование пространства в разрезе К сожалению, я мог бы использовать ваш код Это немного больше объяснений? – David
Tnx pavel, Ваше руководство было большой помощью. – David