Почему peewee принудительно выбирает столбец в целое число
Я не могу использовать функцию sqlite group_concat() в peewee. Вот полный фрагмент. Каким-то образом peewee хочет преобразовать результат group_concat() в целое число, в то время как это строка ("1,2"). Я не могу найти способ подавить это.
from peewee import *
db = SqliteDatabase(':memory:')
class Test(Model):
name = CharField()
score = IntegerField()
class Meta:
database = db
db.create_tables([Test])
Test.create(name='A', score=1).save()
Test.create(name='A', score=2).save()
#select name, group_concat(score) from Test group by name
for t in Test.select(Test.name, fn.group_concat(Test.score)).order_by(Test.name):
pass
Выдает следующую ошибку:
Traceback (most recent call last):
File "C:\Users\u_tem0m\Dropbox\Wrk\sgo\broken.py", line 17, in <module>
for t in Test.select(Test.name, fn.group_concat(Test.score)).order_by(Test.name):
File "C:\Program Files\Python 3.5\lib\site-packages\peewee.py", line 1938, in next
obj = self.qrw.iterate()
File "C:\Program Files\Python 3.5\lib\site-packages\peewee.py", line 1995, in iterate
return self.process_row(row)
File "C:\Program Files\Python 3.5\lib\site-packages\peewee.py", line 2070, in process_row
setattr(instance, column, func(row[i]))
File "C:\Program Files\Python 3.5\lib\site-packages\peewee.py", line 874, in python_value
return value if value is None else self.coerce(value)
ValueError: invalid literal for int() with base 10: '1,2'
2 ответа
Попробуйте добавить coerce(False)
на ваш звонок в group_concat:
query = (Test
.select(Test.name, fn.GROUP_CONCAT(Test.score).coerce(False))
.order_by(Test.name))
for t in query:
pass
Peewee видит, что Test.score является целочисленным полем, поэтому всякий раз, когда в этом столбце вызывается функция, Peewee будет пытаться преобразовать результат обратно в int. Проблема в том, что group_concat возвращает строку, поэтому мы должны сказать Peewee не связываться с возвращаемым значением.
Только что обнаружил, что результат fn.group_concat(""+Test.score) не приведен к целому числу. Но я думаю, что в результате sql может быть менее оптимальным
ВЫБЕРИТЕ "t1". "Name", group_concat(? + "T1". "Score") КАК все баллы ОТ "test" КАК t1 ЗАКАЗАТЬ ПО "t1". "Name" ['']
Кто-нибудь знает более элегантный способ?