2012-06-10 16 views
11

Ad esempio, esiste una tabella denominata 'testtable' con le seguenti colonne: testint (numero intero) e testtext (varchar (30)).Postgresql: inserimento del valore di una colonna da un file

Quello che voglio fare è più o meno una cosa del genere:

INSERT INTO testtable VALUES(15, CONTENT_OF_FILE('file')); 

Durante la lettura della documentazione di PostgreSQL, tutto quello che ho potuto trovare è copia DA/comando, ma questo è quello applicato alle tabelle, non singole colonne.

Quindi, cosa devo fare?

+0

si suppone che il file per contenere solo una riga = row = colonna = campo? – wildplasser

+0

Sì, il file contiene solo una riga, che non contiene nient'altro che quella stringa. – user905747

+0

Ok, vedere potrebbe rispondere. (Ho indovinato) – wildplasser

risposta

2

Se ho capito bene la tua domanda, si poteva leggere la singola stringa (s) in una tabella temporanea e l'uso che per l'inserimento:

DROP SCHEMA str CASCADE; 
CREATE SCHEMA str; 

SET search_path='str'; 

CREATE TABLE strings 
    (string_id INTEGER PRIMARY KEY 
    , the_string varchar 
    ); 
CREATE TEMP TABLE string_only 
    (the_string varchar 
    ); 

COPY string_only(the_string) 
FROM '/tmp/string' 
    ; 

INSERT INTO strings(string_id,the_string) 
SELECT 5, t.the_string 
FROM string_only t 
    ; 

SELECT * FROM strings; 

Risultato:

NOTICE: drop cascades to table str.strings 
DROP SCHEMA 
CREATE SCHEMA 
SET 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "strings_pkey" for table "strings" 
CREATE TABLE 
CREATE TABLE 
COPY 1 
INSERT 0 1 
string_id |  the_string  
-----------+--------------------- 
     5 | this is the content 
(1 row) 

Si prega di notare che la il file viene "visto" dal server mentre il server vede il filesystem. La "directory corrente" da quel punto di vista è probabilmente $ PG_DATA, ma non dovresti assumere nulla e specificare il percorso completo, che dovrebbe essere raggiungibile e leggibile dal dal server. Questo è il motivo per cui ho usato "/ tmp", che non è sicuro (ma un eccellente punto di rendez-vous ;-)

+0

All'inizio, ha funzionato. Poi, ho cercato di farlo da solo. [CODICE] CREATE TABLE test ( testint INTEGER PRIMARY KEY NOT NULL, test text TEXT ); loader CREATE TEMP TABLE ( test text TEXT NOT NULL ); COPY loader (testtext) FROM '/Users/netaro/Untitled.txt'; INSERIRE nel test SELECT 4, t.testtext dal caricatore t; SELEZIONA * dal test; [/ code] Al INSERT INTO, ottengo [CODICE] ERRORE: duplicare valore chiave viola vincolo unico "test_pkey" stato SQL: 23505 Particolare: Tasto (testint) = (4) esiste già. [/ CODE] A proposito, cos'è lo schema dropping e SET search_str? – user905747

+0

Ho l'abitudine di creare uno schema temporaneo per fare esperimenti come questo. (questo è inteso per evitare l'inquinamento dello schema predefinito, ovviamente) È possibile ignorare le prime tre linee schema e search_path. Il tuo errore indica che il valore chiave "4" esiste già quando intendi inserirlo. Non è un errore, sono solo i dati protetti dal vincolo della chiave primaria ("univoco"). – wildplasser

16

Se questo codice SQL viene eseguito dinamicamente dal tuo linguaggio di programmazione, usa i mezzi di quella lingua per leggere il file ed esegui una semplice istruzione INSERT.

Tuttavia, se il codice SQL è pensato per essere eseguito tramite lo strumento della riga psql di comando, è possibile utilizzare il seguente costrutto:

 
\set content `cat file` 
INSERT INTO testtable VALUES(15, :'content'); 

Si noti che questa sintassi è specifico per psql e si avvale della cat comando di shell.

Si è spiegato in dettaglio nel manuale di PostgreSQL:

+1

Questo ha funzionato per me! – Bryan

+1

@elimisteve Sembra che tu abbia un caso d'uso diverso da quello nella domanda. La domanda riguarda l'inserimento dell'intero contenuto di un file in un singolo campo nel database. – vog

Problemi correlati