migrate db.ratings_for_movie_ids to SQLAlchemy
This commit is contained in:
parent
b91fcd3f55
commit
d4933bf1a6
1 changed files with 22 additions and 25 deletions
47
unwind/db.py
47
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)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue