2012-10-10 52 views
115

我有一個名爲數據庫模式:nyummy和一個名爲cimory表:出口從PostgreSQL表的特定行作爲INSERT SQL腳本

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) 
); 

我想將cimory表中的數據導出爲插入SQL腳本文件。但是,我只想輸出城市等於'東京'的記錄/數據(假設城市數據全部爲小寫)。

怎麼辦?

解決方案是否在免費軟件GUI工具或命令行(儘管GUI工具解決方案更好)並不重要。我曾嘗試pgAdmin III,但我找不到這樣做的選項。

+1

您可以跳過INSERT語句,並直接在數據庫之間使用SELECT進行復制。http://albertech.blogspot.com/2016/11/dump-table-to-another-database-in.html – jar

+0

PostgreSQL無法選擇跨數據庫。至少,舊版本不能,Greenplum也不能,也不知道9.x. – PhilHibbs

回答

180

與要導出,然後使用命令行實用程序告訴pg_dump導出到文件設定創建一個表:

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將傾的插入與列名的命令。

--data-only不轉儲架構。

如下所述,創建視圖而不是表格時,只要需要新的導出,就會避免創建表格。

+2

好吧,到目前爲止您的解決方案工作。錯過的一件事是我需要添加「-U user_name」。我也幾乎成功地使用ToraSQL工具,它只是在腳本結果中的日期時間數據中有錯誤。如果沒有人可以在2天內提供GUI工具解決方案,您的答案將被接受 – null

+2

只是想與其他人分享,您也可以使用這個免費的GUI工具:SQL Workbench/J(使用postgreSQL jdbc4驅動程序)來做同樣的事情。 – null

+0

這對於'create view export_view ...'來說會更好,因爲該視圖會隨着對基表的更改而保持最新。 [docs](https://www.postgresql.org/docs/9.5/static/app-pgdump.html)說'--table = table:只轉儲表(或**視圖** ...'所以我有一些希望能夠奏效,但是遺憾地拋棄了一種觀點並沒有產生任何數據:P – poshest

1

您可以查看該表與specifit記錄,然後轉儲SQL文件

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

我在pgAdmin III中嘗試過,但對於View對象,沒有傾銷選項。 – null

+0

嘗試navicat。我使用它,它已經導出sql腳本選項 –

+0

@Giorgi:有沒有免費的版本? – null

-2

具有u試圖pgAdmin的與" EXECUTE QUERY WRITE RESULT TO FILE "選項執行查詢

其只導出數據,否則嘗試像

pg_dump -t view_name DB_name > db.sql 

-t選項用於==轉儲僅表(或視圖或序列)匹配表,refer

+0

這隻會導出一個'創建視圖'語句 – cdmckay

118

對於僅數據輸出使用COPY
你得到每行一個錶行純文本(不INSERT命令)的文件,它的體積更小,速度更快:

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

導入相同的相同結構的另一個表任何地方:

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

COPY寫入和讀取文件本地服務器,不像在pg_dumppsql客戶端程序,其讀取和寫入文件本地客戶端。如果兩者都運行在同一臺機器上,那麼它並不重要,但它可以用於遠程連接。

也有\copy command of psql說:

執行前端(客戶端)拷貝。這是一個運行 SQL COPY命令的操作,但不是服務器讀取或寫入指定文件,psql讀取或寫入文件並在服務器和本地文件系統之間路由數據 。這意味着文件 的可訪問性和權限是本地用戶的權限,而不是 服務器,並且不需要SQL超級用戶權限。

+3

OP專門爲_data調用插入sql腳本file_。我猜他是在說'插入'命令,不是嗎? –

+0

@Clodoaldo:你可能是對的,在這種情況下,你的答案會更合適。也可以單獨複製pgAdmin中的CREATE腳本(如OP提及的GUI)。 –

+2

'STDIN'和'STDOUT'可用於替代文件路徑,對小數據導出很有用。 –

8

SQL Workbench具有這樣的特徵。

運行查詢後,右鍵點擊查詢結果,然後選擇「複製數據作爲SQL> SQL插入」

+1

它很好用。當您選擇'postgres'作爲'驅動程序'時,您可能需要自己下載JDBC驅動程序:https://jdbc.postgresql.org/download.html(它是一個.jar文件 - java二進制文件)和將其添加爲postgresql連接的'驅動程序'。連接字符串(或接口中的URL)應如下所示:jdbc:postgresql://127.0.0.1:5432/db_name – mrmuggles

+0

[DBVisualizer](https://www.dbvis.com/)具有類似和優秀的功能可以複製到一個文件或直接到剪貼板。 – Noumenon

4

對於我的用例,我能夠簡單地管到grep。

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

必須考慮在其他領域有'東京'。 –

+0

@BuyutJokoRivai,因爲它是一個表只能轉儲在大多數情況下它應該沒事 –

12

這是一個方便,快捷方式導出表與pgAdmin的腳本手動,無需額外安裝

  1. 右鍵單擊目標表,然後選擇「備份」 。
  2. 選擇一個文件路徑來存儲備份。作爲格式選擇「平原」。
  3. 打開底部的「轉儲選項#2」選項卡並選中「使用列插入」。
  4. 點擊備份按鈕。
  5. 如果您使用文本閱讀器(例如記事本++)打開生成的文件,您將獲得一個腳本來創建整個表格。從那裏你可以簡單地複製生成的INSERT語句。

此方法也適用於製作export_table的技巧,如@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

當我這樣做時,沒有「Bakckup」選項。這是pgAdmin III v1.18.1連接到Greenplum 4.3.4.1(基於PostgreSQL 8.2.15)。 – PhilHibbs

+0

我安裝了pgAdmin III v1.18.1,這裏有「備份」選項。我連接到PostgreSQL 9.5。所以問題很可能在pgAdmin和Greenplum之間。 – radlr

1

我只是敲了一個快速的方法來做到這一點。它僅適用於單行,所以我創建了一個臨時視圖,它只選擇我想要的行,然後用我想要插入的實際表替換pg_temp.temp_view。因此

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; 

調用:

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

我沒有反對注入式攻擊測試此,請讓我知道,如果通話的quote_nullable不足以說。

此外,它只適用於可以簡單地轉換爲:: text和返回的列。

另外這是Greenplum,但我想不出它爲什麼不能在Postgres,CMIIW上工作的原因。

相關問題