2013-05-17 18 views
9

Sto cercando di importare un file .txt (piuttosto grande) in un geoname di tabella in PostgreSQL 9.1. Sono nella directory/~ del mio server, con un file chiamato US.txt inserito in quella directory. Ho impostato la variabile search_path al geochat, il nome del database su cui sto lavorando in poi entro in questa query:.Postgres COPIA DA file csv - Nessun file o directory

COPY geonames 
FROM 'US.txt', 
DELIMITER E'\t', 
NULL 'NULL'); 

Ho poi ricevo questo errore:

ERROR: could not open file "US.txt" for reading: No such file or directory. 

Devo digitare in \i US.txt o qualcosa di simile prima, o dovrebbe solo scaricarlo dalla directory di lavoro attuale?

risposta

9

Un paio di idee sbagliate:

1.

I'm in the /~ directory of my server

Non v'è alcuna directory /~. È / (directory principale) o ~ (home directory dell'utente corrente). È anche irrilevante per il problema.

2.

I set the search_path variable to geochat, the name of the database I'm working in

Il search_path non ha nulla a che fare con il nome del database. È per gli schemi all'interno del database corrente. Probabilmente hai bisogno di resettare questo.

3.
Si sono tenuti a utilizzare il assoluto percorso per il file. Come documentato in the manual here:

filename

The absolute path name of the input or output file.

4.
DELIMITER: solo rumore.

The default is a tab character in text format

5.
NULL: E 'piuttosto raro utilizzare la stringa effettiva 'NULL' per un valore NULL. Sei sicuro?

The default is \N (backslash-N) in text format, and an unquoted empty string in CSV format.

mia ipotesi (dopo il ripristino search_path - o schema-qualificare il nome della tabella):

COPY geonames FROM '/path/to/file/US.txt'; 
+3

Il manuale si è collegato per il punto 3. afferma che in realtà un percorso relativo è ok per i file di input: 'Un nome file di input può essere un percorso assoluto o relativo! http://www.postgresql.org/docs/current/interactive/sql-copy.html Anche se non sembra funzionare con percorsi relativi. – Risadinha

2

I percorsi sono relativi al server PostgreSQL, non al client psql.

Supponendo di eseguire PostgreSQL 9.4, è possibile inserire US.txt nella directory /var/lib/postgresql/9.4/main/.

1

se si sta eseguendo il comando COPY da uno script, è possibile avere un passaggio nello script che crea il comando COPY con il percorso assoluto corretto.

MYPWD=$(pwd) 
echo "COPY geonames FROM '$MYPWD/US.txt', DELIMITER E'\t';" 
MYPWD= 

è quindi possibile eseguire questa parte in un file ed eseguirlo

./step_to_create_COPY_with_abs_path.sh >COPY_abs_path.sql 
psql -f COPY_abs_path.sql -d your_db_name