在 django 的测试中找不到 Postgres 函数 json_array_elements

Posted

技术标签:

【中文标题】在 django 的测试中找不到 Postgres 函数 json_array_elements【英文标题】:Postgres function json_array_elements does not found while django's tests 【发布时间】:2015-01-11 23:07:13 【问题描述】:

我在使用 json_array_elements 函数的 django 模型中有类方法。

如果它由浏览器执行,它可以正常工作。 但在测试中它失败了。 python manage.py test

Traceback (most recent call last):
  File "path_to_project/dj_server/model_animations/tests.py", line 94, in test_cteating
    response_first = model_animations.views.get_animations_list(request, groupid)
  File "path_to_project/dj_server/model_animations/views.py", line 37, in get_animations_list
    for model_anim in listArray:
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 1535, in __iter__
    query = iter(self.query)
  File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 76, in __iter__
    self._execute_query()
  File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 90, in _execute_query
    self.cursor.execute(self.sql, self.params)
  File "/Library/Python/2.7/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/Library/Python/2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Library/Python/2.7/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
ProgrammingError: function json_array_elements(text) does not exist
LINE 1: ...on_name FROM model_animations_model, json_array...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

在 models.py 中

@classmethod
def animations_list(self, group_id):
    if group_id:
        try:
            listArray = ModelAnimationList.objects.raw(('SELECT * FROM model_animations_model, json_array_elements(animated_groups) AS data WHERE \'"%s"\' = data::text' %group_id))
            return listArray
        except:
            pass
    return None

在views.py中 def get_animations_list(request, group_id): ...

listArray = ModelAnimationList.animations_list(group_id)
if listArray:
    for model_anim in listArray:
        if model_anim:
            anim_dict =  'a_id'  : model_anim.id, 'a_name' : model_anim.animation_name 
            result_anim_list.append(anim_dict)

...

在 tests.py 中

request = HttpRequest()
response_first = model_animations.views.get_animations_list(request, groupid)

已安装: 蟒蛇 2.7 Django 1.7.1 Postgres 9.3.5 psycopg2 2.5.4 Mac 10.10 优胜美地

【问题讨论】:

能否请您发布失败的测试用例的代码? 哦,有很多代码。我会尝试做一些简单的事情。 【参考方案1】:

查询错误json_array_elements(animated_groups)

需要更改为: json_array_elements(animated_groups::json)

【讨论】:

【参考方案2】:

json_array_elements(animated_groups::json)jsonb_array_elements(animated_groups::jsonb) 等 Postgres JSON 处理函数将采用 jsonjsonb 值。

因为 postgres JSON 字段(animated_groups) 存储为文本格式或二进制格式。 所以我们需要使用 ::json::jsonb 转换类型,它给出 json 或 jsonb 格式

查看here

【讨论】:

以上是关于在 django 的测试中找不到 Postgres 函数 json_array_elements的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot jdbc模板在自定义模式下的postgres中找不到表

无法在Postgres中实例化外部Hive Metastore /在类路径中找不到驱动程序

Django:在 Traceback 中找不到异常

在 django、pycharm 中找不到页面?

我收到错误:在 django 中找不到页面

Django Admin '在 /admin/ 中找不到页面