Peewee - 递归 CTE - 文档示例存在问题 - OperationalError 没有这样的列:base.id
Peewee - Recursive CTEs - problem with the documentation example - OperationalError no such column: base.id
我对 Peewee-3 和文档中的教程之一有疑问:
http://docs.peewee-orm.com/en/latest/peewee/querying.html#recursive-ctes
当我尝试 运行 这段代码(几乎与文档完全相同的副本)时,出现错误:
Exception has occurred: OperationalError no such column: base.id
这是我的代码(有一些测试类别的注释部分):
_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)
我做错了什么,我该如何解决,文档中有错误吗?
感谢您的问题报告。问题是我在文档示例中省略了 select 类别“id”。修复非常简单:
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)))
我已经相应地更新了文档。
我对 Peewee-3 和文档中的教程之一有疑问: http://docs.peewee-orm.com/en/latest/peewee/querying.html#recursive-ctes
当我尝试 运行 这段代码(几乎与文档完全相同的副本)时,出现错误:
Exception has occurred: OperationalError no such column: base.id
这是我的代码(有一些测试类别的注释部分):
_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)
我做错了什么,我该如何解决,文档中有错误吗?
感谢您的问题报告。问题是我在文档示例中省略了 select 类别“id”。修复非常简单:
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)))
我已经相应地更新了文档。