我需要用Python和SQLAlchemy创建一个PostgreSQL全文搜索索引.以下是我想要的SQL:

CREATE TABLE person ( id INTEGER PRIMARY KEY, name TEXT );
CREATE INDEX person_idx ON person USING GIN (to_tsvector('simple', name));

现在,在使用ORM时,如何使用SQLAlchemy完成第二部分:

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

推荐答案

可以使用__table_args__中的Index创建索引.此外,如果需要多个字段,我还使用一个函数来创建ts_vector,以使其更加整洁和可重用.如下所示:

from sqlalchemy.dialects import postgresql

def create_tsvector(*args):
    exp = args[0]
    for e in args[1:]:
        exp += ' ' + e
    return func.to_tsvector('english', exp)

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

    __ts_vector__ = create_tsvector(
        cast(func.coalesce(name, ''), postgresql.TEXT)
    )

    __table_args__ = (
        Index(
            'idx_person_fts',
            __ts_vector__,
            postgresql_using='gin'
        )
    )

Update:

people = Person.query.filter(Person.__ts_vector__.match(expressions, postgresql_regconfig='english')).all()

Python-3.x相关问答推荐

正确的本地react 方式-Django身份验证

逐行比较2个Pandas数据帧,并对每一行执行计算

我想使用命令提示符安装 cv2

如何将 OLS 趋势线添加到使用 updatemenus 显示数据子集的 plotly 散点图图形对象?

如何在pyspark的列中按连续1分组并保持具有特定大小的组

如何知道Pandas 列中的每个后续值是否都大于前面的值? Python相关

为列表列表中的每个列表插入 str 到 index[0] 中. Python

Snakemake 'run' 指令不产生错误信息

为 python3 安装 opencv

numpy.ndarray 与 pandas.DataFrame

如何在 Python 中计算 cohen 的 d?

使用打印时,用+连接是否比用,分隔更有效?

为什么等效的 Python 代码要慢得多

我可以替换 Python 中对象的现有方法吗?

当默认 pip 为 pip2 时,升级 pip3 的正确格式是什么?

为什么变量 = 对象不像变量 = 数字那样工作

Python 3.4 多处理队列比 Pipe 快,出乎意料

python asyncio add_done_callback 与 async def

如何从 seaborn / matplotlib 图中删除或隐藏 x 轴标签

十六进制字符串到 Python 3.2 中的带符号整数?