如何在 SQLAlchemy 中的文本数组列上创建 GIN 索引(使用 PostgreSQL 和 python)

How to create GIN index on text array column in SQLAlchemy (with PostgreSQL and python)

我想在 postgre 表上执行大量查询以按标签过滤

1
2
3
4
5
6
7
from sqlalchemy.dialects.postgresql import ARRAY

class Post(db.Model):
    __tablename__ = 'post'

    id = db.Column(db.Integer, primary_key=True)
    tags = db.Column(ARRAY(db.String))

此链接建议将标签存储为带有 GIN 索引的文本数组。

如何在上表中添加 GIN 索引?我是否使用 StringText 数据类型也有区别吗?


我通过以下方式解决了它:

1
2
3
4
5
6
7
8
from sqlalchemy.dialects.postgresql import ARRAY, array

class Post(db.Model):
    __tablename__ = 'post'

    id = db.Column(db.Integer, primary_key=True)
    tags = db.Column(ARRAY(db.Text), nullable=False, default=db.cast(array([], type_=db.Text), ARRAY(db.Text)))
    __table_args__ = (db.Index('ix_post_tags', tags, postgresql_using="gin"), )

并通过

简单查询

1
db.session.query(Post).filter(Post.tags.contains([tag]))

必须将数组类型保持为 Text 而不是 String 否则会发生一些错误