sqlalchemy.exc.ProgrammingError:(psycopg2.errors.UndefinedFunction)函数st_asewkb(点)不存在

问题描述 投票:0回答:1

在 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 扩展,我就不必移动表。欢迎任何其他建议。谢谢你。

postgresql sqlalchemy postgis azure-postgresql geoalchemy2
1个回答
0
投票

您无法直接将 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包含坐标系。

© www.soinside.com 2019 - 2024. All rights reserved.