2 votos

Crear tabla en un esquema, actualizar geometry_columns View en Public schema usando GeoAlchemy2

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.

3voto

mathieu Puntos 53

No estoy 100% seguro de que esto es lo que buscas, pero la ejecución de un básico

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://user:pwd@host/db' )
Base   = declarative_base()

class Test( Base ):

    __tablename__  = 'test'
    __table_args__ = { 'schema': 'other' }

    id   = Column( Integer, primary_key=True )
    geom = Column( Geometry( 'POINT', 4326 ) )

Test.__table__.create( engine )

preparará la mesa test en el esquema other con el geom columna registrada en geometry_columns .

En __table_args__ atributo acepta todos los argumentos que normalmente se pasan a Table clase defina aquí su esquema. Tenga en cuenta que el esquema tiene que estar presente; AFAIK SQLAlchemy no proporciona medios para crear PostgreSQL Esquemas por sí mismo que no sea ejecutar un DDL como consulta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X