簡體   English   中英

Peewee ORM查詢結果fn.COUNT是unicode類型,不是整數

[英]Peewee ORM query result fn.COUNT is type unicode, not integer

與MySQL 5.5對話時,請幫助我了解peewee 2.4.5的行為。 我正在運行一個簡單的查詢來計算與父母相關的孩子; 在這種情況下,文檔位於路徑中。 作為普通的SQL,它可以歸結為:

select p.name, count(d.file) as child_count 
from path as p, doc as d 
where p.id = d.path_id 
group by p.name

Peewee代碼使用fn.COUNT功能,請參見下面的獨立示例。 返回的結果很好,並且符合我期望的結果,但有一個例外:查詢結果對象屬性“ child_count”的類型為unicode而不是整數。 在這個小例子中,有1行,我得到一個字符串(本質上)為“ 1”而不是數字1。

我很困惑,因為在其他查詢中我已經用fn.COUNT完成了,結果是整數類型。 這是功能嗎? 我在這里犯一個愚蠢的python錯誤嗎? 提前致謝。

'''
Example of accessing MySQL from Python using Peewee.
Developed with peewee 2.4.5, pymysql 0.6.3, MySql 5.5
'''
from __future__ import print_function
from peewee import MySQLDatabase, Model, CharField, ForeignKeyField, fn

db = MySQLDatabase(database="test", host="localhost", user="mumble", password="foo")

class MySQLModel(Model):
    '''
    Base class to associate the database object
    '''
    class Meta:
        database = db

class Path(MySQLModel):
    # peewee adds primary key field 'id'
    name = CharField()

class Doc(MySQLModel):
    # peewee adds primary key field 'id'
    path = ForeignKeyField(Path)
    file = CharField()

def main():
    db.connect()
    db.create_tables([Path, Doc], True)
    newpath = Path(name='ab/23')
    newpath.save()
    newdoc1 = Doc(path=newpath.id, file='file1.txt')
    newdoc1.save()
    newdoc2 = Doc(path=newpath.id, file='file2.txt')
    newdoc2.save()
    for row in Path.select():
        print("Path: id=%d, name=%s" % (row.id, row.name))
    for row in Doc.select():
        print("Doc: id=%d, file=%s" % (row.id, row.file))
    # query in plain old SQL:
    # select p.name, count(d.file) from path as p, doc as d where p.id = d.path_id group by p.name
    path_doc_result = (Path
        .select(Path.name, fn.COUNT(Doc.file).alias('child_count'))
        .join(Doc, on=(Path.id == Doc.path)) 
        .group_by(Path.name))
    path_doc_count = len(list(path_doc_result))
    print("Path-doc parent-child result count is %d" % path_doc_count)
    if path_doc_count == 0:
        print("Programmer error, no results!")
    else:
        # get the first one
        d_row = path_doc_result[0]
        #### Why is the child_count attribute not integer? ###
        print("Type of child_count attribute is %s" % type(d_row.child_count))
        print("Path-Doc result: name=%s child_count=%d" % (d_row.name, int(d_row.child_count)))

    newdoc1.delete_instance()
    newdoc2.delete_instance()
    newpath.delete_instance()
    # order matters for foreign keys!
    db.drop_table(Doc)
    db.drop_table(Path)
    db.close()

if __name__ == "__main__":
    main()

Peewee函數查看第一個參數的類型,然后嘗試將返回值強制為該類型。 在大多數情況下,這是有道理的,但我可以在這里了解為什么會引起問題。

要變通,只需調用fn.COUNT(Doc.file).coerce(False).alias('child_count')

path_doc_result = (Path
    .select(Path.name, fn.COUNT(Doc.file).coerce(False).alias('child_count'))
    .join(Doc, on=(Path.id == Doc.path)) 
    .group_by(Path.name))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM