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

时间:2016-05-23 11:01:01

标签: python postgresql indexing sqlalchemy flask-sqlalchemy

我想在postgre表

上执行大量查询以按标签过滤
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))

This link建议将标签存储为带有GIN索引的文本数组。

如何在上表中添加GIN索引?我是否使用String vs Text数据类型?

也有所不同

1 个答案:

答案 0 :(得分:15)

我通过以下方式解决了这个问题:

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"), )

简单地通过

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

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