שאילתת join עם count(*)

תגיות:

היי,
אני מנסה להעביר את השאילתה הבאה ל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:

     Companies.select(Companies.name).join(MoviesCompany).join(Movies).where(Companies.id == id_company).group_by(Companies.name).limit(1)

אשמח לקבל הכוונה.
תודה רבה!

ב peewee יש פינקציה שנקראת fn אשר מאפשרת לך לזמן איזה פונקצית SQL שאתה רוצה אחריה באמצעות הביטוי

fn.sql_function_name

אז נגיד במקרה של count:

fn.count

הפניה לדוקומונטציה בנושא:

לייק 1

תודה, עבדתי עם הדוקמנטציה הזו, אך עדיין לא התקבלה תוצאה.
אם אני רושמת peewee.fn כן יש התקדמות, אבל אז אני מקבלת הודעה שאין זיהוי של טבלה מסויימת אשר כן קיימת לי במסד הנתונים.(movies-company)

לצערי יהיה קשה לזהות את הבעיה בלי לראות את הקוד והשגיאה. אשמח אם תצרפי אותם

לייק 1
@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]

תודה!

5 פוסטים פוצלו לנושא חדש: בעיה בתרגום שאילתה ל־peewee

נסי להוריד את ה¯where ולהדפיס את כל החברות שחוזרות לך. מהשגיאה ניכר שפשוט אין חברות עם ה¯id שסיפקת

הכנסתי id שאני יודעת שקיים, כיוון שגם בדקתי ב db וגם שהשאילתה הייתה עוד בsqlite הכל עבד וקיבלתי שם חברה ומספר הסרטים שהפיקה.

ניסית להמיר ל¯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

אבדוק אם המרה ל int עובדת.
אם יש לי בעיה נוספת עם postgres והמעבר בכתיבה בעזרת peewee של מסד הנתונים (אני עובדת עם כמעט כל הטבלאות ממסד הנתונים בסרטון, לפתוח פוסט חדש בשביל זה או להמשיך כאן עם השאלה?)

עדיף לפתוח אשכול חדש (:

לייק 1