我正在努力收集ETL过程的一些经验,因此我正在寻找将数据从一个地方传输到另一个地方的方法。现在,我想更好地了解postgres_fdw扩展,因为如果我正确理解它,它允许我用一个命令导入整个模式。
IMPORT FOREIGN SCHEMA "public"
FROM SERVER dvdrental into "public";
我已经按照整个文档进行了安装和使用fwd扩展,从其他表手动导入也很好。然而,当我尝试这个";批量进口";,对于一个特定的表,我得到以下错误:
ERROR: type "public.year" does not exist
LINE 5: release_year public.year OPTIONS (column_name 'release_yea...
^
QUERY: CREATE FOREIGN TABLE film (
film_id integer OPTIONS (column_name 'film_id') NOT NULL,
title character varying(255) OPTIONS (column_name 'title') COLLATE pg_catalog."default" NOT NULL,
description text OPTIONS (column_name 'description') COLLATE pg_catalog."default",
release_year public.year OPTIONS (column_name 'release_year'),
language_id smallint OPTIONS (column_name 'language_id') NOT NULL,
rental_duration smallint OPTIONS (column_name 'rental_duration') NOT NULL,
rental_rate numeric(4,2) OPTIONS (column_name 'rental_rate') NOT NULL,
length smallint OPTIONS (column_name 'length'),
replacement_cost numeric(5,2) OPTIONS (column_name 'replacement_cost') NOT NULL,
rating public.mpaa_rating OPTIONS (column_name 'rating'),
last_update timestamp without time zone OPTIONS (column_name 'last_update') NOT NULL,
special_features text[] OPTIONS (column_name 'special_features') COLLATE pg_catalog."default",
fulltext tsvector OPTIONS (column_name 'fulltext') NOT NULL
) SERVER dvdrental
OPTIONS (schema_name 'public', table_name 'film');
CONTEXT: importing foreign table "film"
SQL state: 42704
当我看到第5行时,我明白了postgres抛出错误的原因。它试图创建public.year类型的列release_eyear。然而,这不是一个有效的类型(如INTEGER(,因此我得到了错误。
不过,我该怎么修呢?我的意思是,我如何覆盖postgres试图为这个特定列设置的数据类型?
表film
为year
列使用域,为rating
列使用枚举。
IMPORT FOREIGN SCHEMA
只导入表和视图,所以它不导入域、枚举和其他东西。
在导入架构之前,您需要手动创建它们。
CREATE TYPE public.mpaa_rating AS ENUM (
'G',
'PG',
'PG-13',
'R',
'NC-17'
);
CREATE DOMAIN public.year AS integer
CONSTRAINT year_check CHECK (((VALUE >= 1901) AND (VALUE <= 2155)));