【问题标题】:How to create index on computed fields in peewee如何在 peewee 中的计算字段上创建索引
【发布时间】:2018-10-03 19:34:03
【问题描述】:

我有以下 peewee 模型(简化):

class Foo(BaseModel):
    a = IntegerField() # actually a ForeignKey
    b = IntegerField(null=True) # ForeignKey
    c = IntegerField(null=True) # ForeignKey
    d = TextField()
    e = TextField(null=True)

我想在字段(a、b、c、d)上创建一个唯一索引,将 NULL 值视为相等。例如应该可以只插入一次 (1, NULL, NULL, 2, NULL)。

我设法编写了原始 SQL 查询来添加索引(-1 应该是安全的,因为 b 和 c 是 int>0 上的外键)

CapsuleTranslatorBundle.add_index(SQL('''CREATE UNIQUE INDEX foo_idx ON foo (
    a, # a_id if a is a foreign key
    COALESCE(b, -1),
    COALESCE(c, -1),
    d
);
'''))

我试过了

idx = Foo.index(Foo.a,
                fn.COALESCE(Foo.b, -1),
                fn.COALESCE(Foo.c, -1),
                Foo.d, unique=True)
Foo.add_index(idx)

但是得到了

peewee.OperationalError: near "USING": syntax error

如何在不使用原始 SQL 的情况下添加索引?

【问题讨论】:

    标签: python peewee


    【解决方案1】:

    由于 ModelIndex 构造中的某些代码而导致函数对象被错误解释的错误。

    固定在这里:

    【讨论】:

    • 首先我想 - 奇怪,我已经测试了来自 GIT 的最新代码。然后我注意到:“coleifer 在一小时前提交”;)感谢您解决此问题。
    • 不用担心,很高兴您对此有疑问,只是很抱歉您遇到了这个问题。
    【解决方案2】:

    我自己刚刚完成了对代码的分析。它碰巧是一个错误,已由存储库中的@coleifer 确认和修复 - 谢谢!

    这是在 peewee 3.7.0 上生成有效 SQL(用于 sqlite3)的快速修复(在修复代码发布之前可能会派上用场):

    idx = Foo.index(Foo.a,
                    Value(fn.COALESCE(Foo.b, SQL('-1'))),
                    Value(fn.COALESCE(Foo.c, SQL('-1'))),
                    Foo.d, unique=True)
    Foo.add_index(idx)
    

    生产

    ('CREATE UNIQUE INDEX IF NOT EXISTS "foo_a_d" ON "foo" ("a", COALESCE("b", -1), COALESCE("c", -1), "d")', [])
    

    没有SQL('-1')(仅使用-1)我得到另一个错误peewee.OperationalError: parameters prohibited in index expressions,生成的查询是:'CREATE UNIQUE INDEX IF NOT EXISTS "foo_a_d" ON "foo" ("a", COALESCE("b", ?), COALESCE("c", ?), "d")', [-1, -1]

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2014-10-12
      • 1970-01-01
      相关资源
      最近更新 更多