外部数据包装器fdw_postgres能处理PostGIS的GEOMETRY数据类型吗?

4

我通过fdw_postgres从另一个数据库中访问数据。它运行良好:

CREATE FOREIGN TABLE fdw_table 
(
  name TEXT,
  area double precision,
  use TEXT,
  geom GEOMETRY
)
SERVER foreign_db 
OPTIONS (schema_name 'schema_A', table_name 'table_B')

然而,当我查询fdw_table的data_type时,我得到了以下结果:

name text area double precision use text geom USER-DEFINED

fdw_postgres不能处理PostGIS的GEOMETRY数据类型吗?在这个上下文中,USER-DEFINED是什么意思?

2个回答

5

根据文档中对data_type列的描述:

如果该列是内置类型,则为该列的数据类型;如果该列是某个数组(在这种情况下,请参阅element_types视图),则为ARRAY;否则为USER-DEFINED(在这种情况下,类型在udt_name和相关列中标识)。

因此,这与FDWs无关;您会在物理表中看到相同的定义。

postgres_fdw可以很好地处理自定义数据类型,但目前存在一个限制:如果使用用户定义的类型查询外部表格中的WHERE条件,则不会将此条件推送到外部服务器。

换句话说,如果您的WHERE子句仅引用内置类型,例如:

SELECT *
FROM fdw_table
WHERE name = $1

如果涉及到WHERE子句,那么该子句将被发送到外部服务器,仅检索匹配的行。但是当涉及到用户定义类型时,例如:
SELECT *
FROM fdw_table
WHERE geom = $1

如果这样做,则从外部服务器检索整个表,并在本地执行过滤。

Postgres 9.6将解决此问题,允许您将扩展列表附加到外部服务器对象。


感谢您的详细解释! - andschar
可以在外部数据包装器的定义/选项中编写,例如:CREATE SERVER foreign_example_server FOREIGN DATA WRAPPER foreign_db OPTIONS ( dbname 'testtable', extensions 'postgis'); - leole
请参阅Postgres文档:[https://www.postgresql.org/docs/13/postgres-fdw.html#id-1.11.7.42.10](Postgres主页:F.33.1.4.远程执行选项) - leole

0

显然你需要在 两端 都定义任何非标准类型。别忘了,FDW 功能应该支持各种不同的数据库平台,所以没有魔法方法可以导入数据类型的远程操作。实际上,考虑到一端可能运行在 MS-Windows 上,而另一端则是基于 ARM 的 Linux,甚至只使用 PostgreSQL 也没有明智的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接