O arquivo CSV de importação do PostgreSQL causa erro de sintaxe

8

Estou tentando importar um arquivo CSV para um banco de dados através do comando "COPY"; no entanto, recebo o erro (o que parece comum) de que preciso ser um superusuário e que devo usar "\ copy". No entanto, ao usar \ copy, recebo um erro de sintaxe:

ERROR:  syntax error at or near "\"
LINE 1: \copy

Com o sinal de intercalação apontando para "\". Aqui está a minha consulta:

\copy tablename(column2, column3, column4, column5) from '/home/uploads/data.csv' WITH DELIMITER ',' CSV HEADER'

Eu tentei "copiar" e "\ copiar". O primeiro me deu um erro de superusuário e o último me deu esse erro de sintaxe. Alguma idéia de como consertar isso? faça funcionar?

Estou executando o comando através do campo de entrada sql do myPgAdmin.

A única outra pergunta que tenho é relativa à importação de colunas via tablename (coluna2, coluna3 e assim por diante. Essa é a sintaxe correta para isso?

antjanus
fonte

Respostas:

8

\copyé um comando psql (linha de comando). É não um comando normal do SQL.

Você precisará usar COPY (mas isso exige que o arquivo esteja presente no servidor de banco de dados)

um cavalo sem nome
fonte
Como você importaria arquivos CSV diretamente através do SQL, em vez de usar uma linha de comando?
Antjanus 23/08/2012
11
@antjanus: você usaria o comando COPY como já mencionei (e adam explicado em detalhe)
a_horse_with_no_name
novamente, isso requer permissões de superusuário e não é seguro, certo?
Antjanus 24/08/12
4

Por favor, consulte o manual do postgres para COPY .

No pgAdmin (ou na string sql que você passa por um script ou outra conexão db), você usaria COPY sem o prefixo "\".

então digite algo como: COPY tablename....

Você precisa se certificar de ter os privilégios relevantes para executar o comando, portanto, nesse caso, você deve poder efetuar login no banco de dados e ter acesso de gravação ao 'tablename'. O Postgres também precisa ser capaz de acessar o arquivo, portanto o caminho / home / uploads / deve estar acessível no servidor de banco de dados e o usuário do postgres deve poder ler o arquivo - verifique as permissões para o arquivo e o diretório.

adam f
fonte
2

No meu sistema 9.1, o erro que recebo é bastante informativo:

or_examples=> copy comp_table_test from '/tmp/test';
ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

Se você ler a dica novamente com atenção, ela poderá copiar do stdin. Isto é o que \ copy no psql realmente faz no back-end. Consulte os documentos em http://www.postgresql.org/docs/8.3/static/sql-copy.html para obter mais informações.

Você pode colocar o corpo da cópia em sua consulta ou, pelo menos, é assim que funciona no psql.

Chris Travers
fonte
1
copy coordina from '/tmp/filename.txt' WITH NULL AS ;

É assim que faço no pgAdmin3. Mas verifique os direitos do usuário com cuidado, às vezes os direitos são o problema. (usuário postgres em filename.txt / chmod 777)

Martin
fonte
você precisa ser um superusuário de banco de dados para fazer isso, embora, portanto, a reclamação original.
31712 Chris Travers
0

Outro método é criar uma exibição para a consulta sql. Em seguida, use o comando \ copy.

NinjaLoop
fonte
2
Uma exposição maior seria mais útil.
Michael Green
Como uma exibição ajuda na importação de dados?
a_horse_with_no_name