Peewee:如何从Postgres中选择数组字段为空的数据?

时间:2017-01-15 17:46:58

标签: python postgresql peewee

这是一个与Postgres一起使用的简单Peewee模型

import playhouse.postgres_ext as pg


db = pg.PostgresqlDatabase(""" credentials ... """)


class Artist(pg.Model):
   name = pg.TextField()
   albums = pg.ArrayField(pg.TextField, default=[])

   class Meta:
      database = db


db.create_table(Artist)
Artist.create(name='name1', albums=['album11', 'album12'])
Artist.create(name='name2')

为了选择没有相册的艺术家,SQL查询可能是

>> SELECT * FROM artist WHERE albums = '{}';

 id | name  | albums 
----+-------+--------
  2 | name2 | {}

或选择具有特定姓名的艺术家

>> SELECT * FROM artist WHERE name = 'name1';

 id | name  |      albums       
----+-------+-------------------
  1 | name1 | {album11,album12}

但是当我尝试用Peewee实现它时,我得到以下结果

res = Artist.select().where(Artist.name == 'name1')
assert len(res) == 1 and res[0].name == 'name1'

res = Artist.select().where(Artist.albums == '{}')
assert len(res) == 0

第一个查询将'name1'作为查询参数。

第二个查询将playhouse.postgres_ext._Array对象作为查询参数。

我查看了Postgres Extensions上的文档,但找不到合适的内容。

有人可以解释我做错了什么以及如何用空数组字段选择数据吗?

1 个答案:

答案 0 :(得分:3)

您可以使用原始SQL来解决此限制:

res = Artist.select().where(SQL("albums = '{}'"))
print(len(res))