如何在SQLAlchemy中的JSON PostgreSQL列的嵌套键上创建索引?

时间:2016-01-08 17:00:35

标签: python json postgresql sqlalchemy flask-sqlalchemy

这是一个棘手的问题,希望有人可以通过使用SQLAlchemy发布/他们在PostgreSQL中的JSON(或JSONB)列的嵌套键上创建索引的方法来帮助我们所有人(i'我特意使用Flask-SQLAlchemy,但我认为这对答案来说并不重要。)

我已经尝试了以下索引创建的各种排列,并从关键错误中获取了所有内容,以及' c'这不是一个属性,操作员' getitem'此表达式不支持。

非常感谢任何帮助。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        foreach (var zone in TimeZoneInfo.GetSystemTimeZones())
        {
            cbTimeZones.Items.Add(zone.DisplayName);
        }
    }

    private void cbTimeZones_SelectedIndexChanged(object sender, EventArgs e)
    {
        var zone = TimeZoneInfo.GetSystemTimeZones().Single(x => x.DisplayName == ((ComboBox)sender).SelectedItem.ToString());
        lblTimeZone.Text = TimeZoneInfo.FindSystemTimeZoneById(zone.Id).StandardName;
    }
}

1 个答案:

答案 0 :(得分:1)

我找到的解决方案是使用text创建功能索引。

此处有两个示例索引,具体取决于您是否要将结果转换为文本:

from sqlalchemy.sql.expression import text
from sqlalchemy.schema import Index

class TestThing(db.Model):
    __tablename__ = 'test_thing'

    id = db.Column(db.BigInteger(), primary_key=True)
    data = db.Column(JSONB)

    __table_args__ = (
        Index("ix_6", text("(data->'level1'->'level2_A')")),
        Index("ix_7", text("(data->'level1'->>'level2_A')")),
    )

这将导致以下SQL创建索引:

CREATE INDEX ix_6 ON test_thing(((data -> 'level1'::text) -> 'level2_A'::text) jsonb_ops);
CREATE INDEX ix_7 ON test_thing(((data -> 'level1'::text) ->> 'level2_A'::text) text_ops);