Psycopg2 errors invalidtextrepresentation ошибка ошибочный литерал массива

I’m trying to read from a file and insert the data to a postgresql table in python using the psycopg2.

Here’s the function I wrote:

def insert(file, table, col, conn):
    sql = "INSERT INTO "+table+"("+col+") VALUES(%s)"
    cur = conn.cursor()
    with open(os.path.join(DEFAULTS_FOLDER, file)) as fp:
        line = fp.readline()
        while line:
            cur.execute(sql, (line.rstrip(),))
            line = fp.readline()
        conn.commit()
        cur.close()
    return

For some reason I get an error:

cur.execute(sql, (line.rstrip(),)) psycopg2.DataError: malformed array literal: "hello" LINE 1: INSERT INTO greetings(gname) VALUES('hello')

I also tried to insert a plain string and I still get the same error.

#python #json #django #postgresql #django-rest-framework

Вопрос:

Я новичок в python django. И я пытаюсь создать тестовый сайт с несколькими вариантами ответов. Я вьетнамец, поэтому мои вопросы на вьетнамском языке.

У меня возникли проблемы, когда я пытаюсь вставить ответы на объекты в базу данных.

Моя ошибка:

 django.db.utils.DataError: malformed array literal: "{"A": "Cu01a1m", "B": "chu00e1o"}"
LINE 1: ...answer", "level") VALUES ('Hôm nay ăn gì', '', 1, '{"A": "C...
                                                             ^
DETAIL:  Unexpected array element.
 

Моя POST просьба:

 {
    "title": "Hôm năy ăn gì",
    "category": 3,
    "choices": {
        "A": "Cơm",
        "B": "cháo"
    },
    "answer": "A"
}
 

Вот мой код в models.py :

 from django.db import models
from django.contrib.postgres.fields import ArrayField

# Create your models here.

class Category(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=False)
 
class Question(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    # choices = ArrayField(ArrayField(models.TextField(blank=True)))
    choices = models.JSONField(null=False, blank=False)
    answer = models.TextField(null=False,blank=False)
    level = models.IntegerField(null=True, blank=True)
 

В views.py :

 from django.db.models import query
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics
from rest_framework import viewsets
from app.models import User, Category, Question
from app.serializers import UserSerializer, QuestionSerializer,  CategorySerializer

from django.shortcuts import get_object_or_404

# Create your views here.

class CategoryViewSet(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all()

class QuestionViewSet(viewsets.ModelViewSet):
    serializer_class = QuestionSerializer
    queryset = Question.objects.all()
 

В serializers.py :

 from django.contrib.postgres import fields
from rest_framework import serializers
from app.models import User, Question, Category

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = ['id', 'title', 'description']

class QuestionSerializer(serializers.ModelSerializer):
    # category = CategorySerializer(read_only=False)
    class Meta:
        model = Question
        fields = ['id', 'description', 'category', 'choices', 'answer', 'level']
 

Любое решение для меня, чтобы вставить вьетнамский объект JSON в базу данных. Или я могу использовать arrayField вместо JSONField? Если да, можете ли вы привести мне пример?

Большое спасибо.

Ответ №1:

Мне кажется Question choices , что поле модели не было изменено с array поля на json поле в базе данных. Итак, то, что вы видите, это:

 select '{"A": "Cu01a1m", "B": "chu00e1o"}'::varchar[];
ERROR:  malformed array literal: "{"A": "Cu01a1m", "B": "chu00e1o"}"
LINE 1: select '{"A": "Cu01a1m", "B": "chu00e1o"}'::varchar[];
 

вместо:

 select '{"A": "Cu01a1m", "B": "chu00e1o"}'::jsonb;
           jsonb           
---------------------------
 {"A": "Cơm", "B": "cháo"}
 

В psql посмотрите на таблицу вопросов и посмотрите, что на самом деле представляет собой поле?

Комментарии:

1. Как я могу это исправить? Можете ли вы дать мне решение?

2. Вы проверили, какой тип столбца находится в базе данных, и если да, то что это такое? Бежать migrate ?. Трудно сказать без дополнительной информации о том, как вы изменили значение с ArrayField на JSONField и есть ли в существующем столбце данные?

3. Я думаю, что мой тип столбца-jsonb. После того, как я побежал migrate , у меня возникла эта проблема django.db.utils.ProgrammingError: cannot cast type text[] to jsonb LINE 1: ...on" ALTER COLUMN "choices" TYPE jsonb USING "choices"::jsonb .

4. Ошибка говорит о том, что текущим типом столбца в базе данных является текстовый массив( text[] ). В модели есть столбец, JSONField который переводится jsonb в базу данных. Очевидно migrate , что он не справится с этим переходом. Я никогда не работал migrate с Django, поэтому я не собираюсь там чем-то помогать. Я бы создал новый вопрос о том, как перенести text[] поле в jsonb одно.

Ответ №2:

попробуйте это

 from django.contrib.postgres.fields import JSONField


class Question(models.Model):
    
    choices = JSONField()
 

I’m newbie with python django. And I try to create a Multi choices Test website.
I’m a Vietnamese so my questions is in Vietnamese.

I got an issues when I try to insert an object Answers into database.

My error:

django.db.utils.DataError: malformed array literal: "{"A": "Cu01a1m", "B": "chu00e1o"}"
LINE 1: ...answer", "level") VALUES ('Hôm nay ăn gì', '', 1, '{"A": "C...
                                                             ^
DETAIL:  Unexpected array element.

My POST request:

{
    "title": "Hôm năy ăn gì",
    "category": 3,
    "choices": {
        "A": "Cơm",
        "B": "cháo"
    },
    "answer": "A"
}

Here is my code in models.py:

from django.db import models
from django.contrib.postgres.fields import ArrayField

# Create your models here.

class Category(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=False)
 
class Question(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    # choices = ArrayField(ArrayField(models.TextField(blank=True)))
    choices = models.JSONField(null=False, blank=False)
    answer = models.TextField(null=False,blank=False)
    level = models.IntegerField(null=True, blank=True)

In views.py:

from django.db.models import query
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics
from rest_framework import viewsets
from app.models import User, Category, Question
from app.serializers import UserSerializer, QuestionSerializer,  CategorySerializer

from django.shortcuts import get_object_or_404

# Create your views here.

class CategoryViewSet(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all()

class QuestionViewSet(viewsets.ModelViewSet):
    serializer_class = QuestionSerializer
    queryset = Question.objects.all()

In serializers.py:

from django.contrib.postgres import fields
from rest_framework import serializers
from app.models import User, Question, Category

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = ['id', 'title', 'description']

class QuestionSerializer(serializers.ModelSerializer):
    # category = CategorySerializer(read_only=False)
    class Meta:
        model = Question
        fields = ['id', 'description', 'category', 'choices', 'answer', 'level']

Any solution for me to insert an Vietnamese JSON Object into database. Or Can I use ArrayField instead of JSONField? If yes, can you give me an example?

Thanks very much.

Я новичок в python django. И я пытаюсь создать сайт с несколькими вариантами тестирования.
Я вьетнамец, поэтому мои вопросы на вьетнамском языке.

У меня возникла проблема, когда я пытаюсь вставить объект Answers в базу данных.

Моя ошибка:

django.db.utils.DataError: malformed array literal: "{"A": "Cu01a1m", "B": "chu00e1o"}"
LINE 1: ...answer", "level") VALUES ('Hôm nay ăn gì', '', 1, '{"A": "C...
                                                             ^
DETAIL:  Unexpected array element.

Моя POST просьба:

{
    "title": "Hôm năy ăn gì",
    "category": 3,
    "choices": {
        "A": "Cơm",
        "B": "cháo"
    },
    "answer": "A"
}

Вот мой код в models.py:

from django.db import models
from django.contrib.postgres.fields import ArrayField

# Create your models here.

class Category(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=False)
 
class Question(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    # choices = ArrayField(ArrayField(models.TextField(blank=True)))
    choices = models.JSONField(null=False, blank=False)
    answer = models.TextField(null=False,blank=False)
    level = models.IntegerField(null=True, blank=True)

В views.py:

from django.db.models import query
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics
from rest_framework import viewsets
from app.models import User, Category, Question
from app.serializers import UserSerializer, QuestionSerializer,  CategorySerializer

from django.shortcuts import get_object_or_404

# Create your views here.

class CategoryViewSet(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all()

class QuestionViewSet(viewsets.ModelViewSet):
    serializer_class = QuestionSerializer
    queryset = Question.objects.all()

В serializers.py:

from django.contrib.postgres import fields
from rest_framework import serializers
from app.models import User, Question, Category

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = ['id', 'title', 'description']

class QuestionSerializer(serializers.ModelSerializer):
    # category = CategorySerializer(read_only=False)
    class Meta:
        model = Question
        fields = ['id', 'description', 'category', 'choices', 'answer', 'level']

Есть ли решение для меня, чтобы вставить вьетнамский JSON объект в базу данных. Или могу ли я использовать ArrayField вместо JSONField? Если да, то можете ли вы привести мне пример?

Большое спасибо.

Мне кажется, что поле Question модели choices не было изменено с array на json в базе данных. Поэтому то, что вы видите, это:

select '{"A": "Cu01a1m", "B": "chu00e1o"}'::varchar[];
ERROR:  malformed array literal: "{"A": "Cu01a1m", "B": "chu00e1o"}"
LINE 1: select '{"A": "Cu01a1m", "B": "chu00e1o"}'::varchar[];

вместо:

select '{"A": "Cu01a1m", "B": "chu00e1o"}'::jsonb;
           jsonb           
---------------------------
 {"A": "Cơm", "B": "cháo"}

В psql посмотрите на таблицу вопросов и узнайте, что на самом деле представляет собой поле?

попробуйте это

from django.contrib.postgres.fields import JSONField


class Question(models.Model):
    
    choices = JSONField()

Вернуться на верх

Django Forum

Loading

  • Pss10r chm ошибка установки
  • Pss update contacts exception победа ошибка
  • Psr60 600 70 ошибки
  • Psqlexception ошибка повторяющееся значение ключа нарушает ограничение уникальности
  • Psql сбой ошибка получения мандатных атрибутов на сервере для пользователя zabbix