2015-06-24 2 views
0

У меня есть файл, содержащий только id. идентификатор совпадает с одним из столбцов в таблице. Я хочу извлечь записи в этом столбце и получить результат в файле csv. Я не хочу создавать другую таблицу.Как сохранить записи в psql во время итерации в файле

У меня есть docid.txt файла со следующими данными:

12000072 
112073 
11279 
1182 
11188 
11182094 
82099 
11102 

Каждые из них соответствуют колонку NameID в студенческой таблице. Студенческий стол имеет:

name nameid  dob   performance 
------------------------------------------- 
andre 12000072 12/4/1990 Excellent 
Scott 112073  12/5/1999 Good 
Reagan 2692882  15/7/2003 fair 
Aldo 1402508  4/7/1998 Poor 
Mary 2266257  5/11/1995 Very good 
Walt 11182094 3/12/2000 Good 
Tessy 82099  8/12/1999 Very good 
Skinn 11102  7/2/2002 Excellent 
Smart 678016  12/4/1990 fair 
John 475689  12/5/1999 Poor 
Rita 2796799 12/4/1990 Very good 
Rachael 11188  12/5/1999 Poor 
Gomez 3075168 3/12/2000 Very good 
Becham 3075168 4/7/1998  Good 
Walker 1050879 5/11/1995 Very good 
Tommy 2017451 3/12/2000 Excellent 
Trevor 11279  7/2/2002  Good 
Litin 1182  12/5/1999 fair 
Martha 883368  15/7/2003 fair 
Rafael 3070833 4/7/1998  Poor 
Kim  3070833 5/11/1995 Very good 
Clichy 255918  12/4/1990 Good 
Mario 2706915 12/5/1999 Excellent 

Я хочу удалить студентов с docid из таблицы учеников. Я попытался следующие:

for i in `cat docid.txt;` do 
`psql -A -t $dbname $username << EOF` 
`select * from student where nameid = $i;` 
`EOF` 
`done >>docid.csv` 

Спасибо

+0

Какой двигатель базы данных вы используете? Ваши тэги сбивают с толку. –

+0

postgre on linux. первый документ можно прочитать из любого файла csv (excel, csv или даже txt), но таблица из postgre. У меня нет доступа к созданию таблицы в базе данных. – myMe

ответ

0

Предполагая, что вы используете PostgreSQL, я предлагаю copy их во все таблицы температуры, а затем присоединение на него.

например.

$ psql <<'__END__' 
BEGIN; 
CREATE TEMPORARY TABLE docids (docid integer) ON COMMIT DROP; 
\copy docids from 'docids.txt' 
DELETE FROM student USING docids WHERE nameid = docid; 
COMMIT; 
__END__ 

В дополнение к тому, чище и проще, чем цикл, это будет путь быстрее, и это будет либо успех или неудачу как единое целое, не оставляя половину законченную работу на ошибку.

Если вы хотите вывести удаленные строки, добавьте RETURNING * в инструкцию DELETE и запустите с psql -q для подавления другого выхода.

+0

Я думал об этом, но я работаю удаленно на сервере, и у меня нет доступа к созданию таблицы внутри. Мне нужно решение без создания таблицы. Спасибо – myMe

+0

Вы все равно сможете «СОЗДАТЬ ВРЕМЕНУ ТАБЛИЦУ», даже если вы не можете создать обычные таблицы. Если нет, попросите администратора для прав «TEMP» для вашего пользователя. Если вы действительно, на самом деле даже не можете этого понять, вы, вероятно, можете превратить свои данные в большое предложение VALUES со сценарием и присоединиться к этому. В противном случае вам придется написать скрипт, который выполняет функцию «BEGIN», читает входной файл и отправляет каждую строку как «DELETE», а затем выполняет «COMMIT». Python и psycopg2 могут работать хорошо для этого. –

Смежные вопросы