如何使用 Peewee 从一行中获取值

How to get value from a row using Peewee

我创建了一个简单的数据库来为每个拥有唯一用户 ID(18 位长)的用户存储积分:

CREATE TABLE public.user_points (
    id SERIAL,
    user_id BIGINT UNIQUE,
    points INTEGER
)

我希望能够通过提供用户 ID 创建数据并将其插入到特定用户 ID,例如:

# ------------------------------------------------------------------------------- #
class User(Model):
    user_id = IntegerField(column_name='user_id')
    points = IntegerField(column_name='points')

    class Meta:
        database = postgres_pool
        db_table = "user_points"

    @classmethod
    def add_points(cls, user_id):
        try:
            return (cls
                    .insert(user_id=user_id, points=10)
                    .on_conflict(
                conflict_target=[User.user_id],
                preserve=(User.user_id),
                update={User.points: User.points + 10})
                    .execute())

        except peewee.IntegrityError as err:
            logger.exception(f"{type(err).__name__} at line {err.__traceback__.tb_lineno} of {__file__}, {url}: {err}")
            postgres_pool.rollback()
            return None

效果不错!

现在我的问题是,当我给一个用户 ID 时,我希望它 return 如果数据库中有一个该用户 ID 的用户,以及用户通过这样做获得了多少分

@classmethod
def get_user_points(cls, user_id):
    try:
        return cls.select(cls.points).where(98468376409550848 == User.user_id).get()

    except User.DoesNotExist:
        print('Doesnt exists)')
        return None

    except peewee.IntegrityError as err:
        logger.exception(f"{type(err).__name__} at line {err.__traceback__.tb_lineno} of {__file__}, {err}")
        postgres_pool.rollback()
        return None

并且仅使用 cls.select(cls.points).where(98468376409550848 == User.user_id).get() returns None 但它应该 return 70 - 我想知道为什么以及如何才能获得积分基于用户?

您可以使用returning获取ID和积分:

iq = (cls
      .insert(user_id=user_id, points=10)
      .on_conflict(
          conflict_target=[User.user_id],
          preserve=(User.user_id),
          update={User.points: User.points + 10})
      .returning(User))
return iq.execute()[0]  # Return the user.

您不需要捕获上面的完整性错误,因为您明确告诉 PG 在冲突 w/the 用户 ID 时该怎么做。

要简单地通过 ID 检索用户积分:

return User.select(User.points).where(User.user_id == user_id).scalar()