首页 > 解决方案 > 类型字符变化的值太长(25)

问题描述

我在将 CSV 文件上传到我的数据库时遇到了麻烦,当我尝试上传文件时,我收到“对于类型字符变化 (25) 类型的值太长”的错误消息performance_exccy(请参阅下面的 django 模型)。当我从 SQLite 切换到 PostgreSQL(使用 ElephantSQL)时,开始出现此错误消息,使用 SQLite 上传完美。

导致问题的值是 0.000000000000000000,它有 20 个字符,但在我的模型中我定义max_digit = 40dec_places =20- 所以位数应该不是问题。我还注意到上传错误不是从 CSV 文件的第一行开始,而是从第 12 行开始,之前的行具有相似长度的值。

我的模型:

class Testdata3(models.Model):
    key = models.CharField(max_length=100, primary_key=True)
    mnemonic = models.CharField(max_length=50)
    assetclass = models.CharField(max_length=25)
    value = models.DecimalField(max_digits=25,decimal_places=10)
    performance = models.DecimalField(max_digits=40,decimal_places=20)
    performance_exccy = models.DecimalField(max_digits=40,decimal_places=20)
    performance_abs = models.DecimalField(max_digits=40,decimal_places=20)
    performance_abs_exccy = models.DecimalField(max_digits=40,decimal_places=20)
    date = models.DateField()

    def __str__(self):
        return self.key

我的观点:

def file_upload(request):
    template = "upload.html"
    prompt = {
        'order': 'Order of the CSV should be "placeholder_1", "placeholder_2", "placeholder_3" '
    }

    if request.method == "GET":
        return render(request, template, prompt)

    csv_file = request.FILES['file']

    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'This is not a csv file')

    data_set = csv_file.read().decode('UTF-8')

    io_string = io.StringIO(data_set)

    #Ignores header row by jumping to next row
    next(io_string) 

    for column in csv.reader(io_string, delimiter=';', quotechar="|"):
        # Check if csv-row is empty, if true jump to next iteration/row
        if all(elem == "" for elem in column):
            next
        else:
            _, created = Testdata3.objects.update_or_create(
                key = column[0],

                defaults = {
                'key' : column[0],
                # Get everything after the date part in the primary key
                'mnemonic': re.findall(r'AMCS#[0-9]*(.*)', column[0])[0],
                # Create datetime object from a string
                'date' : datetime.datetime.strptime(column[6], '%d/%m/%Y'),
                'assetclass' : column[10],
                'value' : column[16], 
                'performance' : column[19],
                'performance_abs' : column[20],
                'performance_abs_exccy' : column[30],
                'performance_exccy' : column[31],
                }
            )
        context = {}

    return render(request, template, context)

标签: djangosqlitedjango-modelsdjango-viewsdjango-postgresql

解决方案


我发现了问题:我检查了多个 csv 文件的上传,发现当assetclass字段包含字符串时总是发生错误Sonstige Vermögensgegenstände。所以我在视图中注释掉了该assetclass字段,file_upload突然我能够将数据导入数据库。错误的原因是资产类字段的 max_length=25 而字符串Sonstige Vermögensgegenstände的长度为 30 个字符。因此,尽管 django 告诉我问题与该领域有关,但performance_exccy实际上是由该assetclass领域引起的。


推荐阅读