2016-03-01 31 views
0

所以,這裏的情況是:使用OID在PostgreSQL上(不讀從FS文件)複製命令

我有一個客戶端上傳一個CSV到我的申請,使用OID將它保存在一個表,然後處理數據我從CSV創建一個臨時表,並分發我想要的數據到另一個表,它工作得很好。但我真的不想在每次我想要處理文件系統時首先將csv保存在文件系統中,有任何方法可以使用db中的文件將COPY命令運行到表中?我想要的是這樣的:

COPY temp_table FROM loread(lo_open((SELECT csv_file_oid FROM files_table WHERE liberacao_base_id = 104), 262144), 1000000) WITH DELIMITER ; CSV HEADER; 

這是一種方法來做這樣的事情嗎?我真的必須將文件保存在文件系統上才能運行COPY命令?如果我已經在我的數據庫中擁有它,那麼對我來說似乎有很多資源浪費。提前致謝(對不起,我的英語不好)

+0

它是Web應用程序?如果是這樣的話,那麼文件很可能已經保存在文件系統中,無論如何在一些臨時目錄(這是上傳的工作方式)。如果沒有,那麼你可以在'COPY'命令中使用'STDIN'而不是文件([PostgreSQL 9.5.1 Documentation:COPY](http://www.postgresql.org/docs/current/static/sql-copy.html) )。 –

+0

是的,它是一個Web應用程序,但沒有保存在文件系統上,它被保存到引用postgres表上的二進制字段的OID中。這不是上傳工作的方式,客戶端將二進制數據傳遞給服務器,以它想要的方式處理它,您可以保存在FS上或將bytearraystream保存在內存中,並將其保存在數據庫上,如我的webapp,例如我的應用程序不允許將任何東西保存在FS上作爲公司策略。 – Hllink

回答

1

您是否檢查過外部數據包裝?您可以創建一個「外國」 表。這是一張表,其行爲與普通表格類似,但在後臺每次查詢都會從文件系統中的.csv文件中讀取其內容。

Here官方擴展和here幾個。

官方的擴展是非常容易使用:

--create the extension 
CREATE EXTENSION file_fdw; 

--create the server 
CREATE SERVER file_fdw_server FOREIGN DATA WRAPPER file_fdw; 

--create the foreign table 
CREATE foreign table temp_table (
    id_field INTEGER 
    ,value_field VARCHAR 
) SERVER file_fdw_server 
OPTIONS (
    format 'csv' 
    ,header 'true' 
    ,filename '/path_to_file/file.csv' 
    ,delimiter ';' 
    ,null '' 
); 

--Query the table as a standard table 
select * from temp_table where id_field > 10 limit 100; 
+0

這樣,csv就保存在數據庫裏面,如何用這個字段代替文件系統上的文件? – Hllink

+0

csv不保存在數據庫中。我們剛創建的外表是一個沒有內容的「空」表。每次我們查詢外部表時,postgres都會從文件系統中的文件中讀取表的內容。 – ikusimakusi

+0

你不明白我想說什麼,我必須閱讀的數據(這是一個二進制CSV數據的OID字段)保存在數據庫表上,而不是在文件系統上,所以我不能使用任何與文件名路徑相關的東西... – Hllink

相關問題