sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) функция st_geogfromtext (неизвестно) не существует - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь создать таблицу с географическими данными, используя geoalchemy2 с sqlalchemy, следуя инструкции geoalchemy ORM

У меня установлено расширение 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 голосов
/ 14 февраля 2019

Я обнаружил, что 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)

...