You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Peewee操作PostgreSQL触发IndexError: tuple index out of range问题

解决Flask+Peewee查询时触发的IndexError: tuple index out of range问题

嘿,这个坑我之前踩过!你遇到的IndexError完全是因为Article类的__repr__方法里字符串格式化的占位符数量和传入的参数数量不匹配——你写了5个占位符,但只传了4个参数,导致Python在格式化时找不到对应位置的参数,直接抛出索引越界错误。

问题还原

大概率你的Article模型的__repr__是类似这样的:

from peewee import Model, CharField, TextField, ForeignKeyField

class Author(Model):
    name = CharField()

class Article(Model):
    title = CharField()
    content = TextField()
    author = ForeignKeyField(Author, backref='articles', column_name='author_id')
    
    def __repr__(self):
        # 这里有5个占位符,但format里只传了4个参数
        return "<Article(id={}, title={}, content={}, author_id={}, status={})>".format(
            self.id, self.title, self.content, self.author_id
        )

当你在Flask接口中执行查询(比如Article.select().join(Author))时,Peewee会返回Article对象,而Python在尝试打印/展示这些对象时会自动调用__repr__,这时候参数数量不匹配的问题就暴露了。

修复方案

有两种简单的解决方式,选一种适合你的就行:

1. 补全缺失的参数

如果status确实是Article模型的一个字段,那你只需要在format里加上对应的参数:

def __repr__(self):
    return "<Article(id={}, title={}, content={}, author_id={}, status={})>".format(
        self.id, self.title, self.content, self.author_id, self.status
    )

2. 移除多余的占位符

如果status是你手误多写的,直接删掉对应的占位符就行:

def __repr__(self):
    return "<Article(id={}, title={}, content={}, author_id={})>".format(
        self.id, self.title, self.content, self.author_id
    )

更推荐的写法:用f-string避免参数错位

f-string比传统的format更直观,能直接看到变量和占位符的对应关系,几乎不会出现参数数量不匹配的问题:

def __repr__(self):
    return f"<Article(id={self.id}, title={self.title}, content={self.content}, author_id={self.author_id})>"

额外提示

这个错误虽然是在查询接口执行时触发,但本质和Flask、Peewee的关联查询逻辑无关——纯粹是模型的__repr__方法写得有问题。你可以先单独创建一个Article实例,调用它的__repr__方法测试,就能快速定位问题啦。

内容的提问来源于stack exchange,提问作者David Geismar

火山引擎 最新活动