2012-10-10 33 views
115

Tengo un esquema de base de datos llamada: nyummy y una tabla llamada cimory:exportación filas específicas de una tabla de PostgreSQL como secuencia de comandos SQL INSERT

create table nyummy.cimory (
    id numeric(10,0) not null, 
    name character varying(60) not null, 
    city character varying(50) not null, 
    CONSTRAINT cimory_pkey PRIMARY KEY (id) 
); 

Quiero exportar datos de la tabla cimory como archivo de secuencia de comandos SQL de inserción. Sin embargo, solo deseo exportar registros/datos donde la ciudad es igual a 'tokyo' (suponga que los datos de la ciudad son todos minúsculos).

¿Cómo hacerlo?

No importa si la solución está en las herramientas de la GUI freeware o en la línea de comandos (aunque la solución de herramientas GUI es mejor). Probé pgAdmin III, pero no puedo encontrar una opción para hacer esto.

+1

puede omitir las instrucciones INSERT y simplemente copiar utilizando SELECT directamente entre las bases de datos.http://albertech.blogspot.com/2016/11/dump-table-to-another-database-in.html – jar

+0

PostgreSQL no puede seleccionar entre bases de datos. Al menos, las versiones anteriores no pueden ni tampoco Greenplum, no sabe acerca de 9.x. – PhilHibbs

Respuesta

180

crear una tabla con el conjunto que desee exportar y luego usar el pg_dump utilidad de línea de comandos para exportar a un archivo:

create table export_table as 
select id, name, city 
from nyummy.cimory 
where city = 'tokio' 
$ pg_dump --table=export_table --data-only --column-inserts my_database > data.sql 

--column-inserts será volcado como comandos de inserción con los nombres de columna.

--data-only no volcar el esquema.

Como se comenta a continuación, la creación de una vista en lugar de una tabla obviará la creación de la tabla siempre que sea necesaria una nueva exportación.

+2

Muy bien, hasta ahora su solución funciona. Una cosa que se perdió es que necesito agregar "-U user_name". Casi también tengo éxito con la herramienta ToraSQL, es solo que tiene un error en los datos de fecha y hora en el resultado del script. Si ninguno puede proporcionar una solución de herramienta GUI en 2 días, su respuesta será aceptada – null

+2

Solo quiero compartir con otras personas, también puede usar esta herramienta GUI gratuita: SQL Workbench/J (con el controlador jdbc4 de postgreSQL), para hacer lo mismo . – null

+0

Esto sería mucho mejor con 'create view export_view ...', ya que la vista se mantendría actualizada con los cambios en la tabla base. Los [documentos] (https://www.postgresql.org/docs/9.5/static/app-pgdump.html) dicen '--table = table: volcar solo las tablas (o ** views ** ...' Tenía alguna esperanza de que esto funcionaría, pero arrojar una vista lamentablemente no produce datos.: P – poshest

1

Usted puede hacer la vista de la tabla con los registros specifit y luego volcar archivo sql

CREATE VIEW foo AS 
SELECT id,name,city FROM nyummy.cimory WHERE city = 'tokyo' 
+2

Lo probé en pgAdmin III, pero para el objeto Ver, no hay opción para volcar. – null

+0

Prueba navicat. Lo estoy usando y tiene la opción de script export sql –

+0

@Giorgi: ¿hay versión gratuita? – null

-2

tienen u juzgados en pgadmin ejecución de consulta con " EXECUTE QUERY WRITE RESULT TO FILE " opción

su único exportar los datos, de lo contrario tratar como

pg_dump -t view_name DB_name > db.sql 

opción -t utilizado para ==> Dump sólo las tablas (o vistas o secuencias) de sobremesa, refer

+0

Esto solo exportará una declaración 'create view' – cdmckay

118

Para una solo exportación de datos use COPY.
Se obtiene un archivo con una fila de la tabla por línea como texto plano (no INSERT comandos), que es más pequeño y más rápido:

COPY (SELECT * FROM nyummy.cimory WHERE city = 'tokio') TO '/path/to/file.csv'; 

importación la misma a otra mesa de la misma estructura en cualquier lugar con:

COPY other_tbl FROM '/path/to/file.csv'; 

COPY escrituras y leer archivos local al servidor, a diferencia de los programas cliente como pg_dump o psql la que leer y escribir archivos local al cliente. Si ambos se ejecutan en la misma máquina, no importa mucho, pero sí para las conexiones remotas.

También existe la \copy command of psql que:

Realiza una copia (cliente) frontend.Esta es una operación que ejecuta un comando SQL COPY, pero en lugar de que el servidor lea o escriba el archivo especificado , psql lee o escribe el archivo y enruta los datos entre el servidor y el sistema de archivos local. Esto significa que el acceso y los privilegios del archivo son los del usuario local, no el servidor , y no se requieren privilegios de superusuario SQL.

+3

El OP llama específicamente a _data como insert sql script file_. Supongo que está hablando de comandos 'insertar', ¿no? –

+0

@Clodoaldo: puede que tenga razón, en cuyo caso su respuesta sería mejor. También se podría copiar el script CREATE en pgAdmin por separado (como el OP menciona GUI). –

+2

'STDIN' y' STDOUT' se pueden usar en lugar de la ruta del archivo, lo que es útil para pequeñas exportaciones de datos. –

8

SQL Workbench tiene esa característica.

Después de ejecutar una consulta, haga clic en los resultados de la consulta y seleccione "Copiar datos como SQL> SQL Insertar"

+1

Funciona muy bien. Cuando elige 'postgres' como el 'controlador', es probable que deba descargar los controladores JDBC usted mismo: https://jdbc.postgresql.org/download.html (es un archivo .jar - binario Java) y agréguelo como el "controlador" de la conexión postgresql. La cadena de conexión (o URL como en la interfaz) debería tener el siguiente aspecto: jdbc: postgresql: //127.0.0.1: 5432/db_name – mrmuggles

+0

[DBVisualizer] (https://www.dbvis.com/) tiene una similar y excelente función que puede copiar a un archivo o directamente al portapapeles. – Noumenon

4

Por mi caso de uso pude simplemente tubería a grep.

pg_dump -U user_name --data-only --column-inserts -t nyummy.cimory | grep "tokyo" > tokyo.sql 
+2

Uno debe considerar tener 'tokyo' en otro campo. –

+0

@BuyutJokoRivai ya que es un volcado de tabla en la mayoría de los casos, debería estar bien –

12

Esta es una fácil y rápido manera de exportar una tabla a un guión con pgAdmin manualmente sin instalaciones adicionales:

  1. haga clic en el botón derecho en la tabla de destino y seleccione "Copia de seguridad" .
  2. Seleccione una ruta de archivo para almacenar la copia de seguridad. Como Formato elige "Normal".
  3. Abra la pestaña "Opciones de volcado # 2" en la parte inferior y marque "Usar inserciones de columna".
  4. Haga clic en el botón Copia de seguridad.
  5. Si abre el archivo resultante con un lector de texto (por ejemplo, notepad ++) obtendrá un script para crear la tabla completa. Desde allí, simplemente puede copiar las instrucciones INSERT generadas.

Este método también funciona con la técnica de hacer un export_table como se demuestra en la respuesta de @Clodoaldo Neto.

Click right on target table and choose "Backup"

Choose a destination path and change the format to "Plain"

Open the tab "Dump Options #2" at the bottom and check "Use Column Inserts"

You can copy the INSERT Statements from there.

+0

Cuando hago esto, no hay opción de "Bakckup". Esto es pgAdmin III v1.18.1 que se conecta a Greenplum 4.3.4.1 (basado en PostgreSQL 8.2.15). – PhilHibbs

+0

Instalé pgAdmin III v1.18.1 y allí estaba _la opción de "copia de seguridad". Me conecté a un PostgreSQL 9.5. Entonces, el problema probablemente sea entre pgAdmin y Greenplum. – radlr

1

acabo dejó embarazada a un procedimiento rápido para hacer esto. Solo funciona para una sola fila, así que creo una vista temporal que solo selecciona la fila que quiero, y luego reemplazo el pg_temp.temp_view con la tabla actual en la que quiero insertar.

CREATE OR REPLACE FUNCTION dv_util.gen_insert_statement(IN p_schema text, IN p_table text) 
    RETURNS text AS 
$BODY$ 
DECLARE 
    selquery text; 
    valquery text; 
    selvalue text; 
    colvalue text; 
    colrec record; 
BEGIN 

    selquery := 'INSERT INTO ' || quote_ident(p_schema) || '.' || quote_ident(p_table); 

    selquery := selquery || '('; 

    valquery := ' VALUES ('; 
    FOR colrec IN SELECT table_schema, table_name, column_name, data_type 
        FROM information_schema.columns 
        WHERE table_name = p_table and table_schema = p_schema 
        ORDER BY ordinal_position 
    LOOP 
     selquery := selquery || quote_ident(colrec.column_name) || ','; 

     selvalue := 
     'SELECT CASE WHEN ' || quote_ident(colrec.column_name) || ' IS NULL' || 
        ' THEN ''NULL''' || 
        ' ELSE '''' || quote_literal('|| quote_ident(colrec.column_name) || ')::text || ''''' || 
        ' END' || 
     ' FROM '||quote_ident(p_schema)||'.'||quote_ident(p_table); 
     EXECUTE selvalue INTO colvalue; 
     valquery := valquery || colvalue || ','; 
    END LOOP; 
    -- Replace the last , with a) 
    selquery := substring(selquery,1,length(selquery)-1) || ')'; 
    valquery := substring(valquery,1,length(valquery)-1) || ')'; 

    selquery := selquery || valquery; 

RETURN selquery; 
END 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

invoca así:

SELECT distinct dv_util.gen_insert_statement('pg_temp_' || sess_id::text,'my_data') 
from pg_stat_activity 
where procpid = pg_backend_pid() 

No he probado esto en contra de los ataques de inyección, por favor, hágamelo saber si la llamada quote_literal no es suficiente para eso.

También funciona solo para columnas que se pueden simplemente convertir a :: texto y viceversa.

También esto es para Greenplum, pero no puedo pensar en una razón por la que no funcionaría en Postgres, CMIIW.

Cuestiones relacionadas