Michael and others:
My goal is to have an orm Mixin that implements everything for Postgresql
tsvector full-text search
that I can import as a single object into a new project.
I haven't been able to get a event.listen( ... trigger DDL ...) to work as
part of a Mixin. I don't really
understand the docs on __declare_last__, so I'm working from some
stackoverflow answers. The code
creates the expected Index and Trigger if the statements are defined
outside of the class.
```
class Searchable:
""" An SQLAlchemy ORM Mixin that creates Postgres TSVECTOR columns
:example:
>>> class Text(Searchable, Base):
>>> pass
"""
# Original
inspiration: http://shisaa.jp/postset/postgresql-full-text-search-part-1.html
# __abstract__ = True
_trigger_ddl = DDL(
"create trigger ts_update before insert or update on text for "
"each row execute procedure tsvector_update_trigger(tsvector, "
"'pg_catalog.english', 'text');"
)
# Data Fields
text = Column(String)
# PostgreSQL Full Text Search field
# http://www.postgresql.org/docs/current/static/datatype-textsearch.html
tsvector = Column(postgresql.TSVECTOR)
@declared_attr
def __table_args__(cls):
# CREATE INDEX tsvector_idx ON tsvector USING
gin(to_tsvector('english', message));
# Note: __table_args__ should return a tuple
return (Index(
"tsvector_idx_%s" % cls.__tablename__,
"tsvector",
postgresql_using="gin",
),)
@classmethod
def __declare_last__(cls):
event.listen(
cls,
"after_create",
cls._trigger_ddl.execute_if(dialect="postgresql"),
)
```
When __abstract__ = True the subclass is unmapped and no ddl is emitted on
create_all(). I did not expect that.
Is it possible to have the Mixin execute the event.listen or otherwise
created the trigger?
Thanks,
Luke
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.