היי,
אני מנסה להעביר את השאילתה הבאה לpeewee, אך לא מוצאת תחליף לcount(*)
לפי גוגל יש לכתוב fn.count אך מתקבלת הודעת שגיאה שהמשתנה fn אינו מוכר.
במצב אצלי המשתמש מכניס id של חברה. ומקבל חזרה כמה סרטים היא הפיקה.
(המשתנה company_id זהו מספר חברה שהמשתמש מכניס)
שאילתת sqlite:
"""SELECT c.name as production_name, count(*) AS number_of_movies
FROM companies AS c
INNER JOIN movie_company AS m_c
ON c.id = m_c.company_id
INNER JOIN movies AS m
ON m_c.movie_id = m.id
WHERE c.id = {}
GROUP BY c.name
ORDER BY number_of_movies DESC
LIMIT 1;"""
ב peewee יש פינקציה שנקראת fn אשר מאפשרת לך לזמן איזה פונקצית SQL שאתה רוצה אחריה באמצעות הביטוי
fn.sql_function_name
אז נגיד במקרה של count:
fn.count
הפניה לדוקומונטציה בנושא:
לייק 1
adi1
תודה, עבדתי עם הדוקמנטציה הזו, אך עדיין לא התקבלה תוצאה.
אם אני רושמת peewee.fn כן יש התקדמות, אבל אז אני מקבלת הודעה שאין זיהוי של טבלה מסויימת אשר כן קיימת לי במסד הנתונים.(movies-company)
Yam
לצערי יהיה קשה לזהות את הבעיה בלי לראות את הקוד והשגיאה. אשמח אם תצרפי אותם
לייק 1
adi1
@app.route('/<id_company>')
def company_produced_most_films(id_company):
finish = Companies.select(Companies.name, peewee.fn.count(Companies.name)).join(MoviesCompany).join(Movies).where(Companies.id == id_company).group_by(Companies.name).limit(1).get()
if finish is None:
return render_template('rating.j2', production_count='No such id')
else:
sentence = f" {finish.name} production produced {finish.peewee.fn.count(Companies.name)} movies"
return render_template('rating.j2', production_count=sentence)
השגיאה על השורה של המשתנה finish:
models.CompaniesDoesNotExist: <Model: Companies> instance matching query does not exist:
SQL: SELECT "t1"."name", count("t1"."name") FROM "companies" AS "t1" INNER JOIN "movies_company" AS "t2" ON ("t2"."company_id" = "t1"."id") INNER JOIN "movies" AS "t3" ON ("t2"."movie_id" = "t3"."id") WHERE ("t1"."id" = ?) GROUP BY "t1"."name" LIMIT ? OFFSET ?
Params: [1, 1, 0]
נסי להוריד את ה¯where ולהדפיס את כל החברות שחוזרות לך. מהשגיאה ניכר שפשוט אין חברות עם ה¯id שסיפקת
adi1
הכנסתי id שאני יודעת שקיים, כיוון שגם בדקתי ב db וגם שהשאילתה הייתה עוד בsqlite הכל עבד וקיבלתי שם חברה ומספר הסרטים שהפיקה.
Yam
ניסית להמיר ל¯int? אולי הבעיה היא שם?
נסי להריץ ב¯DBeaver:
SELECT "t1"."name", count("t1"."name") FROM "companies" AS "t1" INNER JOIN "movies_company" AS "t2" ON ("t2"."company_id" = "t1"."id") INNER JOIN "movies" AS "t3" ON ("t2"."movie_id" = "t3"."id") WHERE ("t1"."id" = 1) GROUP BY "t1"."name" LIMIT 1 OFFSET 0
adi1
אבדוק אם המרה ל int עובדת.
אם יש לי בעיה נוספת עם postgres והמעבר בכתיבה בעזרת peewee של מסד הנתונים (אני עובדת עם כמעט כל הטבלאות ממסד הנתונים בסרטון, לפתוח פוסט חדש בשביל זה או להמשיך כאן עם השאלה?)