The T_user_points table has a user_promotion_code_id column
This column sometimes contains numeric data (linked to the user_promotion_code_id column in the m_promotion_codes table) and sometimes does not.
For example, the current data contains four data as shown below.
user_promotion_code_id
232
231
235
NUll
But if the data something above,
I got the following error.
sqlalchemy.exc.MultipleResultsFound: Multiple rows were found when exactly one was required
The code looks like below, what makes this error happens?
def getuserPoint(userId):
"""
Points
"""
if userId is None:
print("Error: userId is None. Please pass a valid user id.")
return 0
today = datetime.now()
try:
subquery = (
db.session.query(
T_user_point.acquired_at,
T_user_point.point,
M_promotion_code.valid_days,
T_user_promotion_code.promotion_code_id,
T_user_point.user_promotion_code_id,
)
.join(T_user_promotion_code, T_user_point.user_promotion_code_id == T_user_promotion_code.user_promotion_code_id)
.join(M_promotion_code, T_user_promotion_code.promotion_code_id == M_promotion_code.promotion_code_id)
.filter(T_user_point.user_id == userId)
.subquery()
)
except Exception as e:
print("An error occurred while generating the subquery:", str(e))
return 0
point_with_valid_days = 0
point_without_valid_days = 0
try:
result = db.session.query(
subquery.c.acquired_at,
subquery.c.point,
subquery.c.valid_days
).all()
print("Subquery Acquisition Date::", subquery.c.acquired_at)
print("Subquery Points:", subquery.c.point)
print("Subquery Effective Date:", subquery.c.valid_days)
print("Subquery Results:", result)
except Exception as e:
print("An error occurred while executing the query:", str(e))
return 0
for row in result:
acquired_at = row.acquired_at
points = row.point
valid_days = row.valid_days
if valid_days is not None:
expiration_date = acquired_at + timedelta(days=valid_days)
print('Expiration date', expiration_date)
if today < expiration_date:
point_with_valid_days += points
print('point_with_valid_days', point_with_valid_days)
else:
point_without_valid_days += 0
try:
point_without_valid_days = (
db.session.query(func.sum(T_user_point.point))
.outerjoin(T_user_promotion_code, T_user_point.user_promotion_code_id == T_user_promotion_code.user_promotion_code_id)
.outerjoin(M_promotion_code, T_user_promotion_code.promotion_code_id == M_promotion_code.promotion_code_id)
.filter(
T_user_point.user_id == userId,
T_user_point.is_deleted == False,
T_user_point.point is not None,
or_(
M_promotion_code.valid_days.is_(None),
T_user_point.user_promotion_code_id.is_(None)
)
)
.scalar() or 0
)
print("point_without_valid_days:", point_without_valid_days)
except Exception as e:
print("An error occurred while executing the query:", str(e))
return 0
point = point_with_valid_days + point_without_valid_days
print('Points with valid dates:', point_with_valid_days)
print('Points with no effective date:', point_without_valid_days)
print('Total points:', point)
return point
However, if the data something below
user_promotion_code_id
NULL
NULL
235
NULL
The following prints without any errors.
Subquery Acquisition Date:: anon_1.acquired_at
Subquery Points: anon_1.point
Subquery Effective Date: anon_1.valid_days
Subquery Results: [(datetime.datetime(2024, 4, 24, 3, 0), 10, 360)]
Expiration date 2025-04-19 03:00:00
point_with_valid_days 10
point_without_valid_days: 170
Points with valid dates: 10
Points with no effective date: 170
Total points: 180
ligtning is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.