repositories.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import sqlite3
  2. from abc import abstractmethod
  3. from core import constants
  4. from core.models import MusicFolder, Track, Tag, Profile
  5. class Repository:
  6. TABLE_NAME = None
  7. MODEL_CLS = None
  8. @abstractmethod
  9. def __init__(self):
  10. self.cnn = sqlite3.connect(constants.DB_PATH)
  11. def execute(self, sql, *parameters):
  12. cur = self.cnn.cursor()
  13. cur.execute(sql, parameters)
  14. return cur
  15. def get_by_id(self, id_):
  16. cur = self.execute(
  17. f"SELECT * FROM {self.TABLE_NAME} WHERE id=?;",
  18. id_
  19. )
  20. return self.MODEL_CLS(**cur.fetchone())
  21. def get_all(self):
  22. cur = self.execute(f"SELECT * FROM {self.TABLE_NAME};", )
  23. return [self.MODEL_CLS(*row) for row in cur.fetchall()]
  24. def get_by(self, field, val):
  25. cur = self.execute(f"SELECT * FROM {self.TABLE_NAME} WHERE {field}=?;", val)
  26. return [self.MODEL_CLS(*row) for row in cur.fetchall()]
  27. def get_by_raw_sql(self, sql, parameters=None):
  28. parameters = parameters if parameters is not None else []
  29. cur = self.execute(sql, parameters)
  30. return [self.MODEL_CLS(*row) for row in cur.fetchall()]
  31. def create(self, model, commit=False):
  32. fields, values = model.as_fields_and_values(True)
  33. self.execute(
  34. f"INSERT INTO {self.TABLE_NAME} ({', '.join(fields)}) VALUES ({', '.join(['?' for v in values])});",
  35. *values
  36. )
  37. if commit:
  38. self.commit()
  39. def update(self, model, commit=False):
  40. fields, values = model.as_fields_and_values(True)
  41. values.append(model.id)
  42. self.execute(
  43. f"UPDATE {self.TABLE_NAME} SET {', '.join([f'{f}=?' for f in fields])} WHERE id=?;",
  44. *values
  45. )
  46. if commit:
  47. self.commit()
  48. def delete(self, model, commit=False):
  49. self.execute(f"DELETE FROM {self.TABLE_NAME} WHERE id=?;", model.id)
  50. if commit:
  51. self.commit()
  52. def commit(self):
  53. self.cnn.commit()
  54. def rollback(self):
  55. self.cnn.rollback()
  56. def __del__(self):
  57. self.cnn.close()
  58. class MusicFolderRepository(Repository):
  59. TABLE_NAME = "MusicFolders"
  60. MODEL_CLS = MusicFolder
  61. def __init__(self):
  62. super().__init__()
  63. class TagRepository(Repository):
  64. TABLE_NAME = "Tags"
  65. MODEL_CLS = Tag
  66. def __init__(self):
  67. super().__init__()
  68. def get_by_track(self, track):
  69. cur = self.execute(
  70. f"""SELECT *
  71. FROM Tags t
  72. INNER JOIN TracksTags tt
  73. ON tt.tag_id = t.id
  74. WHERE tt.track_id=?;""", track.id)
  75. return [self.MODEL_CLS(*row) for row in cur.fetchall()]
  76. class TrackRepository(Repository):
  77. TABLE_NAME = "Tracks"
  78. MODEL_CLS = Track
  79. def __init__(self):
  80. super().__init__()
  81. def get_by_tag(self, tag):
  82. cur = self.execute(
  83. f"""SELECT *
  84. FROM Tracks t
  85. INNER JOIN TracksTags tt
  86. ON tt.track_id = t.id
  87. WHERE tt.tag_id=?;""", tag.id)
  88. return [self.MODEL_CLS(*row) for row in cur.fetchall()]
  89. def get_by_tags(self, tags):
  90. cur = self.execute(
  91. f"""SELECT *
  92. FROM Tracks t
  93. INNER JOIN TracksTags tt
  94. ON tt.track_id = t.id
  95. WHERE tt.tag_id in ({', '.join(['?' for _ in tags])};""", *[tag.id for tag in tags])
  96. return [self.MODEL_CLS(*row) for row in cur.fetchall()]
  97. def get_by_session(self, session):
  98. cur = self.execute(
  99. f"""SELECT *
  100. FROM Tracks t
  101. INNER JOIN SessionsTracks st
  102. ON st.track_id = t.id
  103. WHERE st.session_id=?;""", session.id)
  104. return [self.MODEL_CLS(*row) for row in cur.fetchall()]
  105. class SessionRepository(Repository):
  106. TABLE_NAME = "Sessions"
  107. MODEL_CLS = Track
  108. def __init__(self):
  109. super().__init__()
  110. def get_by_track(self, track):
  111. cur = self.execute(
  112. f"""SELECT *
  113. FROM Tracks t
  114. INNER JOIN SessionsTracks st
  115. ON st.session_id = t.id
  116. WHERE st.track_id=?;""", track.id)
  117. return [self.MODEL_CLS(*row) for row in cur.fetchall()]