在Amazon RDS Postgres上编写PostGIS设置脚本

时间:2014-08-26 02:35:14

标签: postgresql postgis amazon-rds

我正在尝试在我的Amazon RDS Postgres实例上编写PostGIS的设置脚本。这是我正在运行的命令:

create extension postgis;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
create extension postgis_topology;

CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO rds_superuser')
  FROM (
    SELECT nspname, relname
    FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) 
    WHERE nspname in ('tiger','topology') AND
    relkind IN ('r','S','v') ORDER BY relkind = 'S')
s;

alter schema tiger owner to rds_superuser;
alter schema topology owner to rds_superuser;

当我使用psql客户端登录服务器并单独运行每个命令时,一切都运行良好。

测试结果:

dbname=> select na.address, na.streetname, na.streettypeabbrev, na.zip from normalize_address('1 Devonshire Place, Boston, MA 02109') as na;
 address | streetname | streettypeabbrev |  zip  
---------+------------+------------------+-------
       1 | Devonshire | Pl               | 02109
(1 row)

当我将所有这些命令放入.sql文件然后尝试通过psql命令一次运行它们时...

PGPASSWORD='****' psql -h us-west-2-stg-db-1.***.rds.amazonaws.com -U dbuser -d dbname -f setup_postgis.sql -o setup_postgis.log

...尝试测试PostGIS功能时出现以下错误:

dbname=> select na.address, na.streetname, na.streettypeabbrev, na.zip from normalize_address('1 Devonshire Place, Boston, MA 02109') as na;
ERROR:  function normalize_address(unknown) does not exist
LINE 2: from normalize_address('1 Devonshire Place, Boston, MA 02109...
             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

在服务器上运行命令direct时,知道为什么这个命令序列有效,但是当通过命令行作为.sql文件运行时却不行?

注意:我确定我用来运行命令的db用户是rds_superuser角色

1 个答案:

答案 0 :(得分:6)

脚本安装不是问题。当@MikeT建议连接到Postgres DB时,search_path确实存在问题。

当从服务器内部运行install命令时,会自动为正在运行的客户端会话设置search_path以包含tiger扩展。因此,当您在安装扩展程序后立即运行test命令时,它位于search_path中,并且测试命令可以正常工作。

但是,当您断开会话,然后重新连接时,它不再位于search_path中。由于作为远程脚本运行命令会在脚本完成后立即结束会话,因此存在同样的问题。下次连接时,tiger不再位于search_path中,并且test命令不起作用。

因此,为了使此测试在安装后脚本中运行,您必须手动将tiger添加到搜索路径:SET search_path=public,tiger;

然后运行命令,一切都很好。

如果您的应用需要查询中的老虎功能,您将需要通过更改数据库配置的search_path将老虎锁定到您的搜索路径中,如此listserv响应中所述:

http://lists.osgeo.org/pipermail//postgis-users/2012-November/035701.html

或者每次与数据库建立连接时都必须设置它。