2012-06-10 44 views
11

Por ejemplo, hay una tabla llamada 'testtable' que tiene las siguientes columnas: testint (integer) y testtext (varchar (30)).Postgresql: insertar valor de una columna desde un archivo

Lo que quiero hacer es más o menos algo así:

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

Durante la lectura de la documentación de PostgreSQL, todo lo que pude encontrar es copia a DE comando, pero aplicado a las tablas, columnas no individuales/de que uno.

Entonces, ¿qué debo hacer?

+0

Se supone que el archivo que contiene sólo una línea fila = = = columna de campo? – wildplasser

+0

Sí, el archivo contiene solo una línea, que no contiene nada más que esa cadena. – user905747

+0

Ok, vea puede responder. (Supongo) – wildplasser

Respuesta

2

Si entiendo bien su pregunta, se podía leer la cadena simple (s) en una tabla temporal y el uso que de inserción:

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; 

Resultado:

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) 

Tenga en cuenta que la el servidor "ve" el archivo cuando el servidor ve el sistema de archivos. El "directorio actual" desde ese punto de vista es probablemente $ PG_DATA, pero no debe suponer nada, y especifique la ruta completa, que debe ser accesible y legible por el servidor. Es por eso que utilicé '/ tmp', que no es seguro (pero es un excelente punto de encuentro ;-)

+0

Al principio, funcionó. Luego, intenté hacerlo yo mismo. [CODE] prueba CREATE TABLE ( testint INTEGER PRIMARY KEY NOT NULL, texto de prueba TEXTO ); CREAR CUADRO TEMP TABLE ( texto de prueba TEXTO NO NULO ); COPY cargador (texto de prueba) FROM '/Users/netaro/Untitled.txt'; INSERTAR EN prueba SELECCIONAR 4, t.testtext desde el cargador t; SELECCIONAR * de prueba; [/ CODE] Al INSERT INTO, consigo [CÓDIGO] ERROR: duplicar valor clave viola restricción única "test_pkey" estado SQL: 23505 Detalle: Clave (testint) = (4) que ya existe. [/ CODE] Por cierto, ¿qué hay acerca de abandonar el esquema y SET search_str? – user905747

+0

Tengo la costumbre de crear un esquema de temperatura para hacer experimentos como este. (Esto está destinado a evitar la contaminación del esquema predeterminado, obviamente). Puede ignorar las primeras tres líneas de esquema y ruta de búsqueda. Su error indica que el valor clave "4" ya existe cuando tiene la intención de insertarlo. No es un error, solo los datos están protegidos por la restricción de la clave primaria ("única"). – wildplasser

16

Si este código SQL se ejecuta dinámicamente desde su lenguaje de programación, use los medios de ese idioma para leer el archivo y ejecuta una instrucción INSERT simple.

Sin embargo, si este código SQL está destinado a ser ejecutado a través de la herramienta de línea de psql de comandos, puede utilizar el siguiente constructor:

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

Tenga en cuenta que esta sintaxis es específica para psql y hace uso de la cat comando de shell

Se explica en detalle en el manual de PostgreSQL:

+1

¡Esto funcionó para mí! – Bryan

+1

@elimisteve Parece que tienes un caso de uso diferente al que aparece en la pregunta. La pregunta es sobre la inserción de todo el contenido de un archivo en un solo campo en la base de datos. – vog

Cuestiones relacionadas