首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在flask-sqlalchemy中创建order by索引

问如何在flask-sqlalchemy中创建order by索引
EN

Stack Overflow用户
提问于 2015-12-10 05:53:33
回答 1查看 1.6K关注 0票数 4

包括: Flask、Flask-sqlalchemy、Flask-migrate

有一个类描述了这个表:

代码语言:javascript
复制
class Student(db.Model):
    __tablename__ = 'student'

    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.Unicode(250), nullable=False, index=True)
    last_name = db.Column(db.Unicode(250), nullable=False, index=True)
    surname = db.Column(db.Unicode(250), nullable=False, index=True)
    group = db.Column(db.Unicode(250), nullable=False, index=True)
    fio = db.Column(db.Unicode(250*3))

    add_info = db.relationship('AddInfo', uselist=False, backref='student', cascade="all, delete-orphan")

    __table_args__ = (
        db.Index('fio_like', 'fio', postgresql_ops={'fio': 'text_pattern_ops'}),
        db.Index('first_name_like', 'first_name', postgresql_ops={'first_name': 'text_pattern_ops'}),
        db.Index('last_like', 'last_name', postgresql_ops={'last': 'text_pattern_ops'}),
        db.Index('surname_like', 'surname', postgresql_ops={'surname': 'text_pattern_ops'}),
        db.Index('order_fio_desc', fio.desc(), postgresql_using='btree'),
    )

    @classmethod
    def create(cls, first_name, last_name, surname, address, date_of_birth, group):
        obj = cls()

        obj.first_name = first_name
        obj.last_name = last_name
        obj.surname = surname
        obj.group = group
        obj.fio = ' '.join([last_name, first_name, surname]).strip()

        if not obj.add_info:
            obj.add_info = AddInfo()

        obj.add_info.address = address
        obj.add_info.date_of_birth = date_of_birth

        return obj

    @property
    def serialize(self):
        return {
            'id': self.id,
            'fio': self.fio,
            'group': self.group
        }

当您使用以下查询迁移此模型以创建索引order_fio_desc时:

代码语言:javascript
复制
CREATE INDEX order_fio_desc ON student USING btree (student.fio DESC)

由于存在字段名称中的名称,因此PostgreSQL数据库不允许创建这样的索引。但是如果名字段去掉了表的名字,索引创建就没有问题了:

代码语言:javascript
复制
CREATE INDEX order_fio_desc ON student USING btree (fio DESC)

如何请求创建索引生成对吗?

EN

回答 1

Stack Overflow用户

发布于 2019-07-09 22:06:19

您可以像在其他索引中一样,使用postgresql_ops关键字参数指定排序。这将使以下内容有效:

代码语言:javascript
复制
db.Index(
    'order_fio_desc',
    'fio',
    postgresql_using='btree',
    postgresql_ops={'fio': 'DESC'},
),

这将在迁移文件中提供以下输出:

代码语言:javascript
复制
op.create_index('order_fio_desc', 'student', ['fio'], unique=False, postgresql_using='btree', postgresql_ops={'fio': 'DESC'})

这反过来会产生所需的SQL:

代码语言:javascript
复制
CREATE INDEX order_fio_desc ON student USING btree (fio DESC);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34189713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档