将CSV表定义导入PostgreSQL

时间:2017-09-26 16:03:10

标签: postgresql

我有一个表定义文件,格式如下

Table Name    Field Name    Field Data Type
ATableName1   AFieldName1   VARCHAR2
ATableName1   AFieldName2   NUMBER
...
ATableNameX   AFieldNameX1  TIMESTAMP(6)

有没有简单的方法将其导入Postgres以自动创建表?

如果我将文件拆分为单个表,并且每个表只有一个字段名称/数据类型的csv,该怎么办?

Field Name    Field Data Type
AFieldName1   VARCHAR2
AFieldName2   NUMBER

我的搜索仅使用pgfutter通过复制和表创建(基于数据)导出数据。

2 个答案:

答案 0 :(得分:0)

SQL是你的朋友,它非常富有表现力,你可以使用string_agg函数构建你的表def。看看这里的例子。

http://sqlfiddle.com/#!17/0fe14/1

答案 1 :(得分:0)

介意我将varchar2更改为varchar,将number更改为integer.also你有tsv - 为了使用它,请将我的代码中的chr(44)更改为chr(9)。介意我不检查注射,否则这里的工作示例:

t=# do
$$
declare
  _r record;
begin
  for _r in (
with t(l) as (values('ATableName1,AFieldName1i, VARCHAR
ATableName1,AFieldName2,INTEGER
ATableNameX,AFieldNameX1,TIMESTAMP(6)'::text)
)
, r as (select unnest(string_to_array(l,chr(10))) rw from t)
, p as (select split_part(rw,chr(44),1) tn, split_part(rw,chr(44),2) cn,split_part(rw,chr(44),3) tp from r)
select tn||' ('||string_agg(cn||' '||tp, ', ')||')' s from p
group by tn
  ) loop
    raise info '%','create table '||_r.s;
    execute 'create table '||_r.s;
  end loop;
end;
$$
;
INFO:  create table ATableNameX (AFieldNameX1 TIMESTAMP(6))
INFO:  create table ATableName1 (AFieldName1i  VARCHAR, AFieldName2 INTEGER)
DO
Time: 16.743 ms
t=# \dt AF

t=# \dt atablename*
          List of relations
 Schema |    Name     | Type  | Owner
--------+-------------+-------+-------
 public | atablename1 | table | vao
 public | atablenamex | table | vao