类型字符变化的值太长 (25)
value too long for type character varying(25)
我在将 CSV 文件上传到我的数据库时遇到问题,当我尝试上传文件时,我收到字段 performance_exccy
的 "value too long for type character varying(25)" 错误消息(有关我的 django 模型,请参见下文)。当我从 SQLite 切换到 PostgreSQL(使用 ElephantSQL)时开始出现此错误消息,使用 SQLite 上传完美无缺。
导致问题的值是 0.000000000000000000,它有 20 个字符,但在我的模型中我定义了 max_digit = 40
和 dec_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)
PostgreSQL recommends that you simply use the text type for variable-width strings, if you don't want to enforce a maximum.
There's no performance penalty involved in using text.
我发现了问题:
我检查了多个 csv 文件的上传,发现当 assetclass
字段包含字符串 Sonstige Vermögensgegenstände
时,错误总是发生。所以我在我的 file_upload
视图中注释掉了 assetclass
字段,突然间我能够将数据导入数据库。错误的原因是 assetclass 字段有 max_length=25 而字符串 Sonstige Vermögensgegenstände
的长度为 30 个字符。因此,尽管 django 告诉我问题与 performance_exccy
字段有关,但实际上这是由于 assetclass
字段引起的。
我在将 CSV 文件上传到我的数据库时遇到问题,当我尝试上传文件时,我收到字段 performance_exccy
的 "value too long for type character varying(25)" 错误消息(有关我的 django 模型,请参见下文)。当我从 SQLite 切换到 PostgreSQL(使用 ElephantSQL)时开始出现此错误消息,使用 SQLite 上传完美无缺。
导致问题的值是 0.000000000000000000,它有 20 个字符,但在我的模型中我定义了 max_digit = 40
和 dec_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)
PostgreSQL recommends that you simply use the text type for variable-width strings, if you don't want to enforce a maximum. There's no performance penalty involved in using text.
我发现了问题:
我检查了多个 csv 文件的上传,发现当 assetclass
字段包含字符串 Sonstige Vermögensgegenstände
时,错误总是发生。所以我在我的 file_upload
视图中注释掉了 assetclass
字段,突然间我能够将数据导入数据库。错误的原因是 assetclass 字段有 max_length=25 而字符串 Sonstige Vermögensgegenstände
的长度为 30 个字符。因此,尽管 django 告诉我问题与 performance_exccy
字段有关,但实际上这是由于 assetclass
字段引起的。