Usando el ORM SQLAlchemy con GeoAlchemy2, puedo crear la tabla en el esquema público y la vista geometry_columns se actualiza como se esperaba y la tabla creada también incluye un índice gist en la columna geom automáticamente:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from geoalchemy2 import Geometry
from sqlalchemy import Column, Integer
engine = create_engine('postgresql://username:pwd@localhost/my_db')
Base = declarative_base()
class Aa19(Base):
__tablename__ = 'aa19'
id = Column(Integer, primary_key=True)
geom = Column(Geometry('POINT', 4326))
Aa19.__table__.create(engine)
Pero lo que quiero conseguir es crear una tabla en un esquema, asegurándome de que la vista geometry_columns del esquema público se actualiza en consecuencia. No lo consigo. Pensé que incluyendo una variable que establezca el search_path tal vez podría hacer esto, y luego la llamada create_engine() usada arriba se reemplaza así:
db_schema = 'target_schema,public'
engine = create_engine('postgresql://username:pwd@localhost/my_db',
echo=True,
connect_args = {'options':'-csearch_path={}'.format(db_schema)})
Pero esto no funciona y recibo el mensaje de error:
ProgrammingError: (psycopg2.ProgrammingError) relation "public.aa19" does not exist
Eso es bastante obvio y no sorprende. También he intentado establecer la ruta de búsqueda a sólo mi target_schema, con la esperanza de que se actualizaría automáticamente la geometry_columns vista en el esquema público. Pero esto tampoco funciona y recibo el mensaje:
ProgrammingError: (psycopg2.ProgrammingError) type "geometry" does not exist
LINE 4: geom geometry(POINT,4326)
Mi pregunta es: ¿Cómo puedo crear una tabla con columna geom (e índice gist) en un esquema, Y rellenar los metadatos geometry_columns en el esquema público?
Soy nuevo en esta técnica de interactuar con un RDBMS usando python. He pasado por todo el tutorial ORM y la mayor parte del tutorial Core, así como haber leído los documentos. Estoy seguro de que la solución está en alguna parte, pero no he llegado a ella.