From 04a59c8396f62f06916f871d1976c2018cb3a599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lera=20Elvo=C3=A9?= Date: Tue, 1 Jul 2025 15:21:29 +0300 Subject: [PATCH] support lists of tuples in QueryBuilder --- app/db.py | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/app/db.py b/app/db.py index 4da83f7..1391e06 100644 --- a/app/db.py +++ b/app/db.py @@ -87,9 +87,21 @@ class DB: class QueryBuilder: def __init__(self, table): self.table = table - self._where = {} + self._where = [] # list of tuples self._select = "*" - self._params = [] + + + def _build_where(self): + if not self._where: + return "", [] + + conditions = [] + params = [] + for col, op, val in self._where: + conditions.append(f"{col} {op} ?") + params.append(val) + + return " WHERE " + " AND ".join(conditions), params def select(self, columns = "*"): @@ -97,35 +109,34 @@ class DB: return self - def where(self, condition): - self._where.update(condition) + def where(self, condition, operator = "="): + if isinstance(condition, dict): + for key, value in condition.items(): + self._where.append((key, "=", value)) + elif isinstance(condition, list): + for c in condition: + self._where.append(c) return self def build_select(self): sql = f"SELECT {self._select} FROM {self.table}" - if self._where: - conditions = " AND ".join(f"{k} = ?" for k in self._where.keys()) - sql += f" WHERE {conditions}" - return sql, list(self._where.values()) + where_clause, params = self._build_where() + return sql + where_clause, params def build_update(self, data): columns = ", ".join(f"{k} = ?" for k in data.keys()) sql = f"UPDATE {self.table} SET {columns}" - if self._where: - conditions = " AND ".join(f"{k} = ?" for k in self._where.keys()) - sql += f" WHERE {conditions}" - params = list(data.values()) + list(self._where.values()) - return sql, params + where_clause, where_params = self._build_where() + params = list(data.values()) + list(where_params) + return sql + where_clause, params def build_delete(self): sql = f"DELETE FROM {self.table}" - if self._where: - conditions = " AND ".join(f"{k} = ?" for k in self._where.keys()) - sql += f" WHERE {conditions}" - return sql, list(self._where.values()) + where_clause, params = self._build_where() + return sql + where_clause, params def first(self):