without tutorial example postgresql sqlalchemy turbogears

tutorial - python flask orm postgresql



Declarativo de SQLAlchemy: definición de desencadenantes e índices(Postgres 9) (1)

¿Hay alguna forma en la clase SQLAlchemy de una tabla para definir / crear activadores e índices para esa tabla?

Por ejemplo, si tuviera una tabla básica como ...

class Customer(DeclarativeBase): __tablename__ = ''customers'' customer_id = Column(Integer, primary_key=True,autoincrement=True) customer_code = Column(Unicode(15),unique=True) customer_name = Column(Unicode(100)) search_vector = Column(tsvector) ## *Not sure how do this yet either in sqlalchemy*.

Ahora quiero crear un disparador para actualizar "search_vector"

CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE ON customers FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(search_vector,''pg_catalog.english'',customer_code,customer_name);

Luego quise agregar ese campo también como un índice ...

create index customers_search_vector_indx ON customers USING gin(search_vector);

En este momento, después de realizar cualquier tipo de regeneración de base de datos desde mi aplicación, debo agregar la columna para la columna tsvector, la definición del activador y luego la declaración de índice de psql. No es el fin del mundo pero es fácil olvidar un paso. Me refiero a la automatización, por lo que si puedo lograr que todo esto suceda durante la configuración de las aplicaciones, ¡entonces bonificación!


Las indicaciones son sencillas de crear. Para una columna con index=True parámetro index=True como abajo:

customer_code = Column(Unicode(15),unique=True,index=True)

Pero si desea más control sobre el nombre y las opciones, use la construcción de Index() explícita:

Index(''customers_search_vector_indx'', Customer.__table__.c.search_vector, postgresql_using=''gin'')

Los desencadenadores también se pueden crear, pero aún deben estar basados ​​en SQL y enganchados a los eventos DDL . Consulte Personalizar DDL para obtener más información, pero el código puede parecer similar a esto:

from sqlalchemy import event, DDL trig_ddl = DDL(""" CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE ON customers FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(search_vector,''pg_catalog.english'',customer_code,customer_name); """) tbl = Customer.__table__ event.listen(tbl, ''after_create'', trig_ddl.execute_if(dialect=''postgresql''))

Nota: No sé cómo configurar el tipo de datos tsvector : merece una pregunta aparte.