我们有一个案例,我们将数据从平面文件加载到postgres表。它是一个分隔文件。
文件内容:
A|B|C
1.1|2016-12-20|3
我只想加载COLUMN A,B& C,但表有10列。
在Oracle中,使用SQL loader,我们可以使用控制文件来使用所需的字段,我们可以根据需要进行操作。
OPTIONS (DIRECT=TRUE, PARALLEL=FALSE)
LOAD DATA
INFILE FILENAME
APPEND
INTO TABLE TABLENAME
FIELDS TERMINATED BY '\t'
TRAILING NULLCOLS
(
A DECIMAL EXTERNAL,
B "to_date(:B,'YYYY-MM-DD')",
C "case when REGEXP_LIKE(:C,'^[0-9.,]') then :C else '0' end",
)
使用COPY命令加载COLUMNS A,B& C.但是这里的技巧部分是,我们不能像在SQL加载器中那样在COPY命令中的源文件中使用任何操作。所以我们不能使用COPY命令。我离开了那个选项。
其他选项:
PG BULKLOAD实用程序比COPY快得多。我们可以使用CONTROL文件。但选项有限,如下所示;
#
# sample_csv.ctl -- Control file to load CSV input data
#
OUTPUT = table_name # [<schema_name>.]table_name
INPUT = /path/to/input_data_file.csv # Input data location (absolute path)
TYPE = CSV # Input file type
QUOTE = "\"" # Quoting character
ESCAPE = \ # Escape character for Quoting
DELIMITER = "," # Delimiter
但我找不到
的任何选项是否有任何方法可以使用PG BULK LOAD完成上述场景并提供一些参考。找不到任何其他来源。我假设,PGBULKLOAD是快速加载数据的最佳方式。如果我错了,请纠正我。
还有其他选择吗?在不影响性能的情况下。给我一些关于它的想法。
答案 0 :(得分:0)
检查pgloader - 它也可以从类似csv的文件加载数据,它也可以进行转换&#34;飞行&#34;。以下是说明和示例 - http://pgloader.io/howto/csv.html
答案 1 :(得分:0)
我正在使用来自使用 postgreSQL COPY 的 psycopg2 的 copy_from 实用程序。您可以将输入数据作为 STDIN(类似文件的对象)提供。这工作得非常快,可以与 Oracle 中的 SQLLDR 相媲美(我没有针对 SQL Loader 中的直接路径加载选项对其进行测试)。否则,它工作得很好。 https://www.psycopg.org/docs/cursor.html#cursor.copy_from
我使用以下语法:
cur.copy_from(dataIterator,schemaTable,sep=chr(31),null='',columns=objColList)
哪里,