保持 PostgreSQL (FDW) 外部模式同步
Keep PostgreSQL (FDW) Foreign Schema In-Sync
使用带 postgres_fdw
扩展名的 Postgres 9.6,有什么方法可以使本地模式中的表与远程数据库中的表保持同步?我经常需要向远程数据库上的包装模式添加新表,并希望通过 FDW 在本地访问它们,而不必在它们来/去时删除并重新导入我的外部模式或单个表。
我正在寻找一个命令,例如 REFRESH FOREIGN SCHEMA schema_name
。
我认为没有刷新,但删除和导入应该不到一秒:
DROP SCHEMA IF EXISTS local_schema_name CASCADE;
CREATE SCHEMA local_schema_name ;
IMPORT FOREIGN SCHEMA foreign_schema_name
FROM SERVER foreign_server_name INTO local_schema_name ;
删除和重新创建确实有效,但我不喜欢它,因为我经常有依赖于本地表(引用外部模式)的视图,因此删除模式也会删除所有视图。要解决这个问题,您可以重新导入外部架构,但仅限于您创建的新表:
IMPORT FOREIGN SCHEMA <foreign_schema>
LIMIT TO (<new_table1>, <new_table2>)
FROM SERVER <foreign_server>
INTO <local_schema>;
使用最近的 postgres(我使用的是 13),以下工作就像从 psql 刷新一样。引用这些表是为了避免类似于 SQL 关键字的表混淆解析器。
SELECT 'IMPORT FOREIGN SCHEMA <foreign_schema> EXCEPT ('||
(SELECT string_agg('"'||table_name||'"',',')
FROM information_schema.tables
WHERE table_schema='<local_schema>') ||')
FROM SERVER <foreign_server> INTO <local_schema>'\gexec
应该直接使用 EXECUTE FORMAT 而不是 select 和字符串连接进入函数。
如果您没有任何依赖项,最简单的方法是再次删除并创建一个外部 table
DROP SCHEMA IF EXISTS <local_schema_name> CASCADE;
CREATE SCHEMA <local_schema_name> ;
IMPORT FOREIGN SCHEMA <foreign_schema_name> FROM SERVER <foreign_server_name> INTO <local_schema_name>;
如果您有依赖项(视图或其他),您可以 Add/Alter 未同步的列。
ADD COLUMN 主要用于远程 table 添加一些新列,而本地 table 未更新(默认)。
ALTER FOREIGN TABLE <schema_name>.<table_name> ADD COLUMN <column_name> <type of column>
例如:
ALTER FOREIGN TABLE library.book ADD COLUMN co_author text;
如果你想改变当前外国的类型Table:
ALTER FOREIGN TABLE <schema_name>.<table_name> ALTER COLUMN <column_name> TYPE <column type>
ALTER FOREIGN TABLE library.book ALTER COLUMN pages TYPE int;
您可以在此处阅读更多内容Postgres Foreign Table Doc
使用带 postgres_fdw
扩展名的 Postgres 9.6,有什么方法可以使本地模式中的表与远程数据库中的表保持同步?我经常需要向远程数据库上的包装模式添加新表,并希望通过 FDW 在本地访问它们,而不必在它们来/去时删除并重新导入我的外部模式或单个表。
我正在寻找一个命令,例如 REFRESH FOREIGN SCHEMA schema_name
。
我认为没有刷新,但删除和导入应该不到一秒:
DROP SCHEMA IF EXISTS local_schema_name CASCADE;
CREATE SCHEMA local_schema_name ;
IMPORT FOREIGN SCHEMA foreign_schema_name
FROM SERVER foreign_server_name INTO local_schema_name ;
删除和重新创建确实有效,但我不喜欢它,因为我经常有依赖于本地表(引用外部模式)的视图,因此删除模式也会删除所有视图。要解决这个问题,您可以重新导入外部架构,但仅限于您创建的新表:
IMPORT FOREIGN SCHEMA <foreign_schema>
LIMIT TO (<new_table1>, <new_table2>)
FROM SERVER <foreign_server>
INTO <local_schema>;
使用最近的 postgres(我使用的是 13),以下工作就像从 psql 刷新一样。引用这些表是为了避免类似于 SQL 关键字的表混淆解析器。
SELECT 'IMPORT FOREIGN SCHEMA <foreign_schema> EXCEPT ('||
(SELECT string_agg('"'||table_name||'"',',')
FROM information_schema.tables
WHERE table_schema='<local_schema>') ||')
FROM SERVER <foreign_server> INTO <local_schema>'\gexec
应该直接使用 EXECUTE FORMAT 而不是 select 和字符串连接进入函数。
如果您没有任何依赖项,最简单的方法是再次删除并创建一个外部 table
DROP SCHEMA IF EXISTS <local_schema_name> CASCADE;
CREATE SCHEMA <local_schema_name> ;
IMPORT FOREIGN SCHEMA <foreign_schema_name> FROM SERVER <foreign_server_name> INTO <local_schema_name>;
如果您有依赖项(视图或其他),您可以 Add/Alter 未同步的列。
ADD COLUMN 主要用于远程 table 添加一些新列,而本地 table 未更新(默认)。
ALTER FOREIGN TABLE <schema_name>.<table_name> ADD COLUMN <column_name> <type of column>
例如:
ALTER FOREIGN TABLE library.book ADD COLUMN co_author text;
如果你想改变当前外国的类型Table:
ALTER FOREIGN TABLE <schema_name>.<table_name> ALTER COLUMN <column_name> TYPE <column type>
ALTER FOREIGN TABLE library.book ALTER COLUMN pages TYPE int;
您可以在此处阅读更多内容Postgres Foreign Table Doc