sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)函数st_geogfromtext(未知)不存在

时间:2019-02-14 17:09:14

标签: postgresql sqlalchemy postgis

我正在尝试在geoalchemy ORM tutorial之后使用带有geoalchemy2和sqlalchemy的地理数据创建表

我在使用的架构上安装了postgis扩展。我要连接的用户是架构的所有者

Screenshot from pgAdmin view

当我运行python代码时:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from geoalchemy2 import Geography
import src.config as config

Base = declarative_base()

class Lake(Base):
    __tablename__ = 'lake'
    __table_args__ = ({'schema': 'geobox'})
    id = Column(Integer, primary_key=True)
    country_iso_code = Column(String(2))
    zone_code = Column(String(45))
    zone_type = Column(String(45))
    zone_test = Column(Geography('POINT'))

from sqlalchemy import create_engine
engine = create_engine('postgres://{user}:{pwd}@{host}:{port}/{database}'.format(
    user=config.DbConfig().username,
    pwd=config.DbConfig().password,
    host=config.DbConfig().host,
    port=config.DbConfig().port,
    database=config.DbConfig().database), echo=True)

Lake.__table__.create(engine)

我得到了错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "geography" does not exist

我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

我发现search_path的设置不正确,因为postgis已安装在表级别而不是架构级别。

然后与sqlalchemy不相关。我只需要更改search_path,以使pg可以找到安装了postgis的表:

ALTER ROLE "my_role_name" SET search_path TO 'my_table_name',"$user",public;

(假设my_table_name是已安装postgis扩展名的表的名称)