为什么 peewee 将 select 列强制为整数
Why peewee coerces select column to integer
我不能在 peewee 中使用 sqlite 函数 group_concat()。这是完整的片段。不知何故,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'
刚刚发现 fn.group_concat(""+Test.score) 的结果没有转换为整数。但我认为结果 sql 可能不太理想
SELECT "t1"."name", group_concat(? + "t1"."score") AS allscore FROM "test" AS t1 ORDER BY "t1"."name" ['']
有人知道更优雅的方法吗?
尝试在您对 group_concat 的呼叫中添加 coerce(False)
:
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 return 是一个字符串,所以我们必须告诉 Peewee 不要弄乱 return 值。
我不能在 peewee 中使用 sqlite 函数 group_concat()。这是完整的片段。不知何故,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'
刚刚发现 fn.group_concat(""+Test.score) 的结果没有转换为整数。但我认为结果 sql 可能不太理想
SELECT "t1"."name", group_concat(? + "t1"."score") AS allscore FROM "test" AS t1 ORDER BY "t1"."name" ['']
有人知道更优雅的方法吗?
尝试在您对 group_concat 的呼叫中添加 coerce(False)
:
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 return 是一个字符串,所以我们必须告诉 Peewee 不要弄乱 return 值。