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.