ProgrammingError:列“X”是双精度类型,但表达式是数字[]类型

Posted

技术标签:

【中文标题】ProgrammingError:列“X”是双精度类型,但表达式是数字[]类型【英文标题】:ProgrammingError: column "X" is of type double precision but expression is of type numeric[] 【发布时间】:2016-10-19 14:51:39 【问题描述】:

我正在尝试使用 Django Rest Framework 和 Psycopg2 库编写 API。此 API 适用于 PostgreSQL 数据库。我需要在这个数据库中存储 2 个浮点数组字段,因为 API 与 2 个传感器一起工作,这些传感器将数据流式传输到 android 应用程序,它们以两个数组的形式存储在 APP 中,它们通过 JSON 发送到 API REST。

这些是我的 models.py、serializers.py 和 views_api.py:

Models.py

class DataTest(models.Model):
  patient = models.ForeignKey(Patient)
  label = models.CharField(max_length=36)
  angle_data = ArrayField(models.FloatField())
  emg_data = ArrayField(models.FloatField())
  created_at = models.DateTimeField(auto_now_add=True)
  modified_at = models.DateTimeField(auto_now=True)

  def __unicode__(self):
    return self.patient

Serializers.py

class DataTestSerializer(serializers.Serializer):
  pk = serializers.IntegerField(read_only=True)
  label = serializers.CharField()
  angle_data = serializers.ListField(child=serializers.FloatField())
  emg_data = serializers.ListField(child=serializers.FloatField())
  patient = serializers.PrimaryKeyRelatedField(queryset=Patient.objects.all())

  def create(self, validated_data):
    return DataTest.objects.create(**validated_data)

  def update(self, instance, validated_data):
    instance.label = validated_data.get('label', instance.label)
    instance.angle_data = validated_data.get('angle_data', instance.angle_data)
    instance.emg_data = validated_data.get('emg_data', instance.emg_data)
    instance.patient = validated_data.get('patient', instance.patient)
    instance.save()
    return instance

api.py

class DataTestList(APIView):

  def get(self, request, format=None):
    dataTests = DataTest.objects.all()
    serializer = DataTestSerializer(dataTests, many=True)
    return Response(serializer.data)

  def post(self, request, format=None):
    serializer = DataTestSerializer(data=request.data)
    if serializer.is_valid():
       serializer.save()
       return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.error_messages,
status=status.HTTP_400_BAD_REQUEST)

最后,我测试了 API 并发送了一个 JSON 示例: “标签”:“测试”, “角度数据”:[1.434, 2.243, 3.234], "emg_data":[2.3, 2.1], “病人”:1

我收到以下错误:

ProgrammingError: 列“angle_data”是双精度类型,但表达式是 numeric[] 类型 LINE 1: ..., “created_at”, “modified_at”) VALUES (1, 'Test', ARRAY[ 1.0,... ^

提示:您需要重写或强制转换表达式。

我已经调试了 API,并且我看到序列化程序接收到一个浮点列表。我想问题是PostgreSQL中的列是双精度的,而浮点列表没有用双精度编码。

有人可以帮我吗?

您好,谢谢!!

【问题讨论】:

您是否通过psql 检查了表并验证了基础列类型是否正确(例如,通过\d [tablename] 命令)?该错误表明该列本身不是数组。 从您的代码 angle_data = serializers.ListField(child=serializers.FloatField()) 它不是数组 - 是吗?.. 尝试将 1.434 传递给 angle_data 而不是 [1.434, 2.243, 3.234] 嗨!感谢您的回复。我检查了这些列,它们是double precisions []。例如,当我尝试存储数组时,[1.434, 2.243, 3.234] API 响应相同的错误。但是,我尝试插入一个唯一值 1.434 (without brackets) 并存储它。我还尝试将serializer 更改为modelSerializer,因为我认为ListField 适用于字典,而不是列表。但是我得到了同样的错误:( 好的,我已经解决了这个错误。问题出在我编写数组的形式上。我总是用标准公式 html 编写数组,但总是遇到同样的错误。但是,如果我以原始 JSON 格式编写相同的数据,我就可以完美地存储数据。我不明白第一种方式的问题出在哪里。 【参考方案1】:

我发现这篇文章在处理 django 模型中的 JSON 数据时很有帮助

https://www.laurencegellert.com/2018/09/django-tricks-for-processing-and-storing-json/

我还使用https://github.com/django-json-api/django-rest-framework-json-api 来获得格式更好的带有 DRF 的超媒体 RESTful API。还有https://docs.djangoproject.com/en/dev/releases/3.1/#jsonfield-for-all-supported-database-backends

这更像是一个高级别的建议。

【讨论】:

以上是关于ProgrammingError:列“X”是双精度类型,但表达式是数字[]类型的主要内容,如果未能解决你的问题,请参考以下文章

psycopg2.ProgrammingError:列 cons.consrc 不存在

ProgrammingError:列“日期”不存在

ProgrammingError:列“product”的类型是product[],但表达式的类型是text[] enum postgres

如何在Objective-C中检查输入是双精度还是字符串?

当它是双精度时,LookUpEdit 不选择新输入的值

在 MATLAB 中,默认情况下变量真的是双精度的吗?