From d4933bf1a6a0af65c9e4cbdb3b372e14cf3acc83 Mon Sep 17 00:00:00 2001 From: ducklet Date: Thu, 23 Mar 2023 23:33:59 +0100 Subject: [PATCH] migrate `db.ratings_for_movie_ids` to SQLAlchemy --- unwind/db.py | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/unwind/db.py b/unwind/db.py index 1f15bc9..b91d3c1 100644 --- a/unwind/db.py +++ b/unwind/db.py @@ -505,40 +505,37 @@ async def find_ratings( async def ratings_for_movie_ids( ids: Iterable[ULID | str] = [], imdb_ids: Iterable[str] = [] ) -> Iterable[dict[str, Any]]: - conds: list[str] = [] - vals: dict[str, str] = {} + conds = [] + + ratings = Rating.__table__ + movies = Movie.__table__ if ids: - sqlin, sqlin_vals = sql_in(f"{Movie._table}.id", (str(x) for x in ids)) - conds.append(sqlin) - vals.update(sqlin_vals) + conds.append(movies.c.id.in_([str(x) for x in ids])) if imdb_ids: - sqlin, sqlin_vals = sql_in(f"{Movie._table}.imdb_id", imdb_ids) - conds.append(sqlin) - vals.update(sqlin_vals) + conds.append(movies.c.imdb_id.in_(imdb_ids)) if not conds: return [] - query = f""" - SELECT - {Rating._table}.score AS user_score, - {Rating._table}.user_id AS user_id, - {Movie._table}.imdb_score, - {Movie._table}.imdb_votes, - {Movie._table}.imdb_id AS movie_imdb_id, - {Movie._table}.media_type AS media_type, - {Movie._table}.title AS canonical_title, - {Movie._table}.original_title AS original_title, - {Movie._table}.release_year AS release_year - FROM {Movie._table} - LEFT JOIN {Rating._table} ON {Movie._table}.id={Rating._table}.movie_id - WHERE {(' OR '.join(conds))} - """ - + query = ( + sa.select( + ratings.c.score.label("user_score"), + ratings.c.user_id.label("user_id"), + movies.c.imdb_score, + movies.c.imdb_votes, + movies.c.imdb_id.label("movie_imdb_id"), + movies.c.media_type.label("media_type"), + movies.c.title.label("canonical_title"), + movies.c.original_title.label("original_title"), + movies.c.release_year.label("release_year"), + ) + .outerjoin_from(movies, ratings, movies.c.id == ratings.c.movie_id) + .where(sa.or_(*conds)) + ) async with locked_connection() as conn: - rows = await conn.fetch_all(bindparams(query, vals)) + rows = await conn.fetch_all(query) return tuple(dict(r._mapping) for r in rows)