LINUX.ORG.RU

в чем дело


0

1

создал таблицу

create table monitors (
mon_ID NUMERIC not null,
mon_INV_NUM varchar(9) not null,
mon_MODEL varchar(200) not null,
mon_UCH varchar(200) not null,
mon_USER varchar(200),
constraint mon_id_pk primary key (mon_id)
);

прописываю

copy monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER)
from {'/home/saidmir/project/105/monitors.txt'};

ругается на то, что типа

Physical database connection acquired for: phone
 00:12:22  [COPY - 0 row(s), 0.000 secs]  [Error Code: 0, SQL State: 42601]  ERROR: syntax error at or near "{"
  Позиция: 68
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

Вроде пиши как в доке написано

COPY tablename [ ( column [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ] 
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ] 
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE NOT NULL column [, ...] ]

или просто глюк или что

{ - метасимвол, { 'file' | STDIN } означает или 'file', или STDIN,
что-то одно обязано присутствоать, в отличие от [...].

ABW ★★★★★
()
Ответ на: комментарий от ABW

Прописываю вот так

copy monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER)
from '/home/saidmir/project/105/monitors.txt';

ругает на то, что

08:06:38  [COPY - 0 row(s), 0.000 secs]  [Error Code: 0, SQL State: 42501]  ERROR: must be superuser to COPY to or from a file
  Подсказка: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

а если добавить вот такую строку которая отвечает за кирилицу

copy monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER)
from '/home/saidmir/project/105/monitors.txt'
set client_encoding = 'win1251';

то опять синтаксическая ошибка

08:11:50  [COPY - 0 row(s), 0.000 secs]  [Error Code: 0, SQL State: 42601]  ERROR: syntax error at or near "set"
  Позиция: 113
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

мне кажется или в Оракле синтаксис был полегче или я просто к нему уже привык хотя что там sql что тут

saidmir
() автор топика
Ответ на: комментарий от saidmir

В мануале

COPY weather FROM '/home/user/weather.txt';

у меня

copy monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER)
from '/home/saidmir/project/105/monitors.txt'
USING DELIMITERS ',';

и все равно

08:22:06  [COPY - 0 row(s), 0.000 secs]  [Error Code: 0, SQL State: 42501]  ERROR: must be superuser to COPY to or from a file
  Подсказка: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

гугл не помогает

saidmir
() автор топика
Ответ на: комментарий от saidmir

must be superuser

Тут же русским языком написано почему.

anonymous
()
Ответ на: комментарий от saidmir

Насколько понял у тебя постгрес. Какая версия? У меня (9.1) это выглядит так

test=# COPY monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER) FROM '/home/user/psql/dump' (DELIMITER ',');
COPY 3

at ★★
()
Ответ на: комментарий от at

8.4

Делаю от mainuser а не через developer

list=# COPY monitors (mon_id,mon_inv_num,mon_model,mon_uch,mon_user) FROM '/home/saidmir/project/105/monitors.txt' DELIMITER ',';
ERROR:  invalid input syntax for type numeric: "mon_id"
КОНТЕКСТ:  COPY monitors, line 1, column mon_id: "mon_id"
list=# 
saidmir
() автор топика
Ответ на: комментарий от saidmir

Спасибо всем проблему решил оказывается дело в том, что мой фаил был следующего содержания

mon_id,mon_inv_num,mon_model,mon_uch,mon_user
1,03041655,Монитор-2 S7500 17 Tone Evro,Геофизический,
2,06020069,Монитор Samsung SM 17,Геофизический,
3,07010003,Монитор СRT Samsung,Подготовка кадров,
4,06091346,Монитор LG Т730ВН,Подготовка кадров,
5,07080829,Монитор Samsung 793D F17GRT,БОТ и ТБ,

а нужно было без первой строчки

1,03041655,Монитор-2 S7500 17 Tone Evro,Геофизический,
2,06020069,Монитор Samsung SM 17,Геофизический,
3,07010003,Монитор СRT Samsung,Подготовка кадров,
4,06091346,Монитор LG Т730ВН,Подготовка кадров,
5,07080829,Монитор Samsung 793D F17GRT,БОТ и ТБ,
......

результат

list=# COPY monitors (mon_id,mon_inv_num,mon_model,mon_uch,mon_user) FROM '/home/saidmir/project/105/monitors.txt' DELIMITER ',';
COPY 69

Спасибо всем огромное теперь знаю как это делать

Записал в заметки и в голову

saidmir
() автор топика
Ответ на: комментарий от saidmir
user@home:~/psql$ psql-8.4 test
psql (8.4.13)
Введите "help", чтобы получить справку.

test=# COPY monitors(mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER) FROM '/home/user/psql/dump' DELIMITER ',';
COPY 3

это есть суперюзер.

test=# \copy monitors(mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER) FROM './dump' DELIMITER ','
Если обычный юзверь.

at ★★
()
$ cat ./monitors.txt 
mon_id,mon_inv_num,mon_model,mon_uch,mon_user
1,03041655,Монитор-2 S7500 '17 Tone Evro,Геофизический,
2,06020069,Монитор Samsung SM '17,Геофизический,
3,07010003,Монитор СRT Samsung,Подготовка кадров,
4,06091346,Монитор LG Т730ВН,Подготовка кадров,
5,07080829,Монитор Samsung 793D F17GRT,БОТ и ТБ,
6,07080923,Монитор старый, грязный,БОТ и ТБ,

$ cat ./monitors.awk 
# 
BEGIN { 
  FS=","; 
  NFDECLARE=5;                                          # декларируем количество полей в записи
  PROLOG="insert into monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER) "
} 
{ if (NF != NFDECLARE)          ERROR("AWK")            # пустые строки, запятые в полях и пр.
  else if ($0 ~ /'/)            ERROR("SQL")            # поля не должны включать "'"
       else if ($1 !~ /[0-9]+/) ERROR("LOG")            # первое поле должно быть числом 
            else                EXERCISE(NFDECLARE)     # 
} 
END {   print ("-- ---------------------");             # статистика
        STAT("WEL");
        STAT("AWK");
        STAT("SQL");
        STAT("LOG");
        printf ("-- TOTAL lines: %7i\n",NR); 
}
function EXERCISE(NFD) { 
  print (PROLOG); 
  printf ("  values ('%s'",$1); 
  for (i=2;i<=NFD;i++) printf (",'%s'",$i); 
  printf (");\n\n"); 
  STATS["WEL"]++;
}
function ERROR(MSG) { printf ("-- {%s} %s\n\n",MSG,$0); STATS[MSG]++; } 
function STAT(MSG)  { printf ("-- {%s} lines: %7i\n",MSG,STATS[MSG]); } 
# 

$ awk -f ./monitors.awk ./monitors.txt | tee ./monitors.sql
-- {LOG} mon_id,mon_inv_num,mon_model,mon_uch,mon_user

-- {SQL} 1,03041655,Монитор-2 S7500 '17 Tone Evro,Геофизический,

-- {SQL} 2,06020069,Монитор Samsung SM '17,Геофизический,

insert into monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER) 
  values ('3','07010003','Монитор СRT Samsung','Подготовка кадров','');

insert into monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER) 
  values ('4','06091346','Монитор LG Т730ВН','Подготовка кадров','');

insert into monitors (mon_ID, mon_INV_NUM, mon_MODEL, mon_UCH, mon_USER) 
  values ('5','07080829','Монитор Samsung 793D F17GRT','БОТ и ТБ','');

-- {AWK} 6,07080923,Монитор старый, грязный,БОТ и ТБ,

-- {AWK} 

-- ---------------------
-- {WEL} lines:       3
-- {AWK} lines:       2
-- {SQL} lines:       2
-- {LOG} lines:       1
-- TOTAL lines:       8
$ grep {AWK} monitors.sql 
-- {AWK} 6,07080923,Монитор старый, грязный,БОТ и ТБ,
-- {AWK} 
-- {AWK} lines:       2
$ grep {SQL} monitors.sql 
-- {SQL} 1,03041655,Монитор-2 S7500 '17 Tone Evro,Геофизический,
-- {SQL} 2,06020069,Монитор Samsung SM '17,Геофизический,
-- {SQL} lines:       2
$ grep {LOG} monitors.sql 
-- {LOG} mon_id,mon_inv_num,mon_model,mon_uch,mon_user
-- {LOG} lines:       1
$
anonymous
()
Ответ на: комментарий от anonymous

Ну и прямо тут же фикс на строку 8 (чтоб соответствовало заявленному):

else if ($1 !~ /[0-9]+/) ERROR(«LOG») # первое поле должно быть числом

       else if ($1 !~ /^[0-9]+$/) ERROR("LOG")            # первое поле должно быть числом 

т.е. не «первое поле должно содержать цифры», а «все первое поле должно быть числом».

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.