在 Azure 上运行的 Postgres 灵活服务器。 Postgis 扩展已使用
安装到 dbo 架构中create extension postgis schema dbo;
其中还包含核心数据表。在 pgadmin 模式的扩展下,我看到 postgis,但包含函数的表位于 ext 模式中。
在 python 中,我有一个 SQLAlchemy 模型,并且还使用 geoalchemy 作为点数据类型。
from sqlalchemy import Column, Integer, String, ForeignKey, Float,Date
from sqlalchemy.orm import relationship
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from geoalchemy2 import Geometry, WKTElement
class Building(Base):
__tablename__ = 'building'
__table_args__ = {'schema': 'dbo'}
building_id = Column(Integer, primary_key=True)
placekey = Column(String, unique=True)
street_address = Column(String)
city = Column(String)
state = Column(String)
county = Column(String)
postal_code = Column(String)
coordinates = Column(Geometry(geometry_type='POINT'))
当 SQLAlchemy 检查是否存在符合我的条件的记录时,它将坐标列包装在函数 st_asewkb(point) 中。我可以看到这个函数存在于 ext 模式中,但由于表位于引擎工作的 dbo 中,因此它会抛出以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedFunction) function st_asewkb(point) does not exist
LINE 1: ...building.postal_code AS dbo_building_postal_code, ST_AsEWKB(...
我考虑更改数据库上的搜索路径,但担心其他意外后果。真的很想了解为什么扩展继续使用 ext 模式(如果这是规范的或者只是 azure 托管 postgres 的结果)以及我是否可以更改它。或者让 sqlalchemy 直接引用架构上的函数,这样如果我无法移动 postgis 扩展,我就不必移动表。欢迎任何其他建议。谢谢你。
您无法直接将 PostGIS 功能
st_asewkb()
应用于内置数据类型 point
。有一个从 point
到 geometry
的类型转换:
\dC point
List of casts
Source type │ Target type │ Function │ Implicit?
═════════════╪═════════════╪══════════╪═══════════════
[...]
point │ geometry │ geometry │ no
[...]
(7 rows)
但是该转换不是隐式的,因此您必须使用显式转换:
st_asewkb(CAST (some_point AS geometry))
整个事情对我来说没有什么意义:
point
仅适用于欧几里德平面上的点,而EWKB包含坐标系。