Почему 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" ['']

Кто-нибудь знает более элегантный способ?

Другие вопросы по тегам