如何使用 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()
我创建了一个简单的数据库来为每个拥有唯一用户 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()