首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Peewee -递归CTEs文档示例的问题- OperationalError no这样的列: base.id

Peewee -递归CTEs文档示例的问题- OperationalError no这样的列: base.id
EN

Stack Overflow用户
提问于 2020-09-23 13:42:08
回答 1查看 65关注 0票数 0

我对Peewee-3和文档中的一个教程有问题:http://docs.peewee-orm.com/en/latest/peewee/querying.html#recursive-ctes

当我试图运行这段代码(几乎完全复制自doc)时,会出现一个错误:

发生了

异常: OperationalError没有这样的列: base.id

下面是我的代码(有一些测试类别的注释部分):

代码语言:javascript
复制
_db = SqliteDatabase(DB_FILE)

class _Base(Model):
    class Meta:
        database = _db

class Category(_Base):
    name = CharField()
    parent = ForeignKeyField('self', backref='children', null=True)


# ADDING CATEGORIES
# _db.connect()
# _db.create_tables([Category])
# stocks = Category(name="stocks", parent=None)
# stocks.save()
# models = Category(name="models", parent=None)
# models.save()

# smoke = Category(name="smoke", parent=stocks)
# smoke.save()

# front = Category(name="front", parent=smoke)
# front.save()

# side = Category(name="side", parent=smoke)
# side.save()

# fluffy = Category(name="fluffy", parent=front)
# fluffy.save()
# _db.close()


Base = Category.alias()
level = Value(1).alias('level')
path = Base.name.alias('path')
base_case = (Base
             .select(Base.name, Base.parent, level, path)
             .where(Base.parent.is_null())
             .cte('base', recursive=True))

RTerm = Category.alias()
rlevel = (base_case.c.level + 1).alias('level')
rpath = base_case.c.path.concat('->').concat(RTerm.name).alias('path')
recursive = (RTerm
             .select(RTerm.name, RTerm.parent, rlevel, rpath)
             .join(base_case, on=(RTerm.parent == base_case.c.id)))

cte = base_case.union_all(recursive)

query = (cte
         .select_from(cte.c.name, cte.c.level, cte.c.path)
         .order_by(cte.c.path))

for category in query:
    print(category.name, category.level, category.path)

我做错了什么,如何修复它,文档中有一个错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-23 18:23:44

谢谢你的问题报告。问题是我没有从文档中选择示例中的类别"id“。修复非常简单:

代码语言:javascript
复制
base_case = (Base
             .select(Base.id, Base.name, Base.parent, level, path)  # Add Base.id
             .where(Base.parent.is_null())
             .cte('base', recursive=True))

...
recursive = (RTerm
             .select(RTerm.id, RTerm.name, RTerm.parent, rlevel, rpath)  # Add RTerm.id
             .join(base_case, on=(RTerm.parent == base_case.c.id)))

我已经相应地更新了文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64029347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档