עזרה במעבר לשאילתת peewee

תגיות: ,

היי,

יש לי שתי בעיות:
אני מנסה להמיר את השאילתות הבאות ולבצע חישוב מתמטי, אך מקבלת את השגיאה הבאה על שורת החישוב המתמטי:
(המשתנה vote זה ציון שהמשתמש מכניס)

vote_db = """SELECT vote_average from {} WHERE {} = ? LIMIT 1""".format('movies', 'id')
get_vote = cursor.execute(vote_db, (id_movie,)).fetchone()[0]
average_db = """SELECT vote_count from {} WHERE {} = ? LIMIT 1""".format('movies', 'id')
    get_average = cursor.execute(average_db, (id_movie,)).fetchone()[0]
# 

לקוד מותאם לpeewee:

get_vote = Movies.select(Movies.vote_average).where(Movies.id == id_movie)
    get_average = Movies.select(Movies.vote_count).where(Movies.id == id_movie)

ולבצע את החישוב:

new_vote = ((get_vote * get_average) + vote) / (get_average + 1)

אך מקבלת את הודעת השגיאה הבאה, לה לא מצאתי פתרון, אשמח לעזרה:
TypeError: unsupported operand type(s) for *: ‘ModelSelect’ and ‘ModelSelect’

הבעיה השנייה:

updating_vote = Movies.update(vote_average = new_vote).where(Movies.id == id_movie)

עבור שורה זו אני מקבלת את הודעת השגיאה:
peewee.OperationalError: near “?”: syntax error

המון תודה!

לגבי הבעיה הראשונה:
כמו שזה נראה get_vote ו-get_average מכילים אובייקט modelSelect ולכן הוא לא מאפשר לבצע את הכפולה ביניהם.
תנסי לקחת את המידע הרלוונטי לצורך החישוב מהמודל עצמו.
אם את מצפה לערך אחד אז תוסיפי בסוף השליפה:

Movies.select(Movies.vote_average).where(Movies.id == id_movie).get()

ואז תראי מה המודל מכיל ותגשי לשדה vote_average.
במידה ואת מצפה לכמה רשומות אז תצטרכי כנראה לרוץ בלולאה ואז על כל רשומה לגשת לשדה הרלוונטי.

מקווה שעזר, בהצלחה :slight_smile:

לייק 1

אם אני מבינה נכון, נראה לי שאת מנסה להכפיל שני מופעים של Movies ולא שני מספרים.
get_vote הוא בעצם מופע של Movies ולא בעל ערך מספרי.
ניתן להשתמש בו get_vote.שם משתנה
לגבי השגיאה השניה, יכול להיות שזה צריך להיות Movies.vote_average.

לייק 1

היי, תודה על העזרה של שניכם.

ניסיתי להוסיף .get(), אך הדבר לא עזר, קיבלתי עכשיו את הודעת השגיאה הבאה:
TypeError: unsupported operand type(s) for *: ‘Movies’ and ‘Movies’

אשמח מאוד לעזרה נוספת (לפני המעבר ל peewee השאילתות עובדות כמו שצריך)

הבסיס זה לנסות להבין מה הסוג של הדבר שחוזר משני הצדדים של הכפל שאת מנסה לבצע – ב־get_vote וב־get_average (השורה שעבורה נזרקת השגיאה).
כרגע מה שחוזר בשני המשתנים הללו הוא אובייקט מסוג סרט, ואי אפשר להכפיל בין סרטים – אין לזה משמעות פייתונית (אי אפשר להכפיל בין “מטריקס” לבין “מלך האריות”).

מה שקורה זה ש־peewee מחזיר לך אובייקט שכולל בתוכו את התוצאות לשאילתה – מבחינתו זו יכולה להיות תוצאה אחת או המון תוצאות. כשאת עושה .get, את מבקשת תוצאה אחת.
אבל גם בתוצאה הזו, אחרי שעשית .get, העניין הוא ש־peewee “לא יודע” שביקשת רק עמודה אחת, ולכן הוא לא מחזיר לך ישר ערך – הוא חייב שתצייני לו מאיזו עמודה את רוצה לקחת את הערך כדי להשתמש בו.

במקרה הזה הייתי מנסה משהו כמו get_vote.vote_average * get_average.vote_count

עבד!
המון המון תודה!
אשמח להסבר נוסף, מדוע אם אני מבקשת שדה מסויים בתוך הselect , לא יוחזר רק ערך העמודה המבוקשת?

כדי לשמור על קונסיסטנטיות עם מצב שבו את מבקשת מהפונקציה יותר מעמודה אחת.
בד"כ בתכנות מעדיפים קונסיסטנטיות על נוחות.
זה אומר שאם תריצי את הפונקציה בהרבה צורות שונות, תעדיפי תמיד לקבל את אותו סוג נתונים בחזרה.
ככה תוכלי לעשות נניח for, לספק בתוכו לפונקציה פרמטרים שונים, ולדעת שאפשר להתייחס לכל התוצאות שיחזרו באותה צורה בדיוק.

לייק 1

המון המון תודה לכולכם!

2 לייקים