使用PHP时出现PostgreSQL查询错误

使用PHP时出现PostgreSQL查询错误,postgresql,postgis,Postgresql,Postgis,当我运行一个包含::geometrycasting的PostgreSQL查询时,我得到一个类型“geometry”不存在的错误。我正在Ubuntu 12.04上使用php5 pgsql V5.3.10、php5 fpm 5.4.13、Laravel 4、Postgresql 9.1、PostGIS 2.0.1几何图形类型是特定于PostGIS的 如果没有强制转换,查询运行良好。使用pgAdmin3直接查询PostgreSQL数据库时,原始查询也可以正常工作。为什么会这样 查询 $busstops

当我运行一个包含
::geometry
casting的PostgreSQL查询时,我得到一个
类型“geometry”不存在的错误。我正在Ubuntu 12.04上使用php5 pgsql V5.3.10、php5 fpm 5.4.13、Laravel 4、Postgresql 9.1、PostGIS 2.0.1<代码>几何图形
类型是特定于PostGIS的

如果没有强制转换,查询运行良好。使用pgAdmin3直接查询PostgreSQL数据库时,原始查询也可以正常工作。为什么会这样

查询

$busstops = DB::connection('pgsql')
    ->table('locations')
    ->select(DB::raw('geog::geometry as lat, geog::geometry as lng'))
    ->get();
                     List of data types
 Schema |   Name   |               Description
--------+----------+-----------------------------------------
 public | geometry | postgis type: Planar spatial data type.
(1 row)
无强制转换的查询(无错误)

错误:

异常:SQLSTATE[42704]:未定义对象:7错误:类型“geometry”不存在
第1行:从“位置”中选择geog::geometry作为lat
^(SQL:从“位置”中选择geog::geometry作为lat)(绑定:数组)(
))


\dT几何体

$busstops = DB::connection('pgsql')
    ->table('locations')
    ->select(DB::raw('geog::geometry as lat, geog::geometry as lng'))
    ->get();
                     List of data types
 Schema |   Name   |               Description
--------+----------+-----------------------------------------
 public | geometry | postgis type: Planar spatial data type.
(1 row)

应用程序正在切换
搜索路径
,以便
公共
不在
搜索路径
上。默认情况下,扩展插件安装在
public
中,因此当应用程序切换
搜索路径时,您会发现
geometry
和其他PostGIS类型和功能变得不可用

您需要:

  • 创建一个新的模式
    postgis
  • 将PostGIS扩展移到
    PostGIS
    模式中;及
  • 确保新的
    postgis
    模式始终位于
    search\u路径上,可能使用特定于应用程序的设置

您是否有可能将
几何体
类型安装到手动查询中的
搜索路径
上的单独模式中,而不是通过您的工具?或者你在工具和手动查询中没有真正连接到同一个数据库?@CraigRinger我运行了
createextensionpostgis;创建扩展postgis拓扑连接到数据库时,我(错误地?)假设它将为所有模式安装
几何体
类型?我有多个模式,如何为特定/所有模式安装
几何体
类型?不必为每个模式安装类型。您可以选择在自己的模式中安装扩展,在这种情况下,该模式必须位于
search\u路径
上,扩展才能使用。你似乎没有这样做,所以我怀疑这是一个搜索路径问题。在
psql
中用
\dT geometry
确认,确认
几何体
类型列在哪个模式中。如果它安装在
public
中,那么您的
search\u路径
可能被设置为不包含应用程序的
public
模式?@CraigRinger用输出更新了问题。似乎它只在
公共模式中可用!!是的,因此您需要确保
public
模式始终位于
search\u路径
,或者将其安装为只包含PostGIS的其他模式(例如称为
PostGIS
),并确保始终位于
search\u路径
)。请参阅
CREATE EXTENSION
SCHEMA
子句:是否有方法确保某些架构始终位于搜索路径中?