import json from collections.abc import Iterable from typing import TypedDict from folkugat_web.dal.sql import get_connection from folkugat_web.dal.sql.temes import lyrics as lyrics_dal from folkugat_web.model.temes import Lyrics query = """ SELECT id, lyrics FROM temes """ LyricRowTuple = tuple[int, str] class OldLyricRowDict(TypedDict): title: str content: str def _build_lyric(tema_id: int, lyric_dict: OldLyricRowDict) -> Lyrics: return Lyrics( id=None, tema_id=tema_id, title=lyric_dict["title"], content=lyric_dict["content"], ) def _build_lyrics(row: LyricRowTuple) -> list[Lyrics]: tema_id = row[0] lyric_dicts: list[OldLyricRowDict] = json.loads(row[1]) return [_build_lyric(tema_id, lyric_dict) for lyric_dict in lyric_dicts] with get_connection() as con: cur = con.cursor() _ = cur.execute(query) iter_rows: Iterable[LyricRowTuple] = cur.fetchall() rows = list(map(_build_lyrics, iter_rows)) _ = cur.execute("DELETE FROM tema_lyrics") for lyrics in rows: for lyric in lyrics: _ = lyrics_dal.insert_lyric(lyric=lyric, con=con) drop_query = """ ALTER TABLE temes DROP COLUMN lyrics""" _ = cur.execute(drop_query) print("DONE!")