support lists of tuples in QueryBuilder

This commit is contained in:
Lera Elvoé 2025-07-01 15:21:29 +03:00
parent 604f9d6aba
commit 04a59c8396
Signed by: yagich
SSH Key Fingerprint: SHA256:6xjGb6uA7lAVcULa7byPEN//rQ0wPoG+UzYVMfZnbvc

View File

@ -87,9 +87,21 @@ class DB:
class QueryBuilder: class QueryBuilder:
def __init__(self, table): def __init__(self, table):
self.table = table self.table = table
self._where = {} self._where = [] # list of tuples
self._select = "*" 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 = "*"): def select(self, columns = "*"):
@ -97,35 +109,34 @@ class DB:
return self return self
def where(self, condition): def where(self, condition, operator = "="):
self._where.update(condition) 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 return self
def build_select(self): def build_select(self):
sql = f"SELECT {self._select} FROM {self.table}" sql = f"SELECT {self._select} FROM {self.table}"
if self._where: where_clause, params = self._build_where()
conditions = " AND ".join(f"{k} = ?" for k in self._where.keys()) return sql + where_clause, params
sql += f" WHERE {conditions}"
return sql, list(self._where.values())
def build_update(self, data): def build_update(self, data):
columns = ", ".join(f"{k} = ?" for k in data.keys()) columns = ", ".join(f"{k} = ?" for k in data.keys())
sql = f"UPDATE {self.table} SET {columns}" sql = f"UPDATE {self.table} SET {columns}"
if self._where: where_clause, where_params = self._build_where()
conditions = " AND ".join(f"{k} = ?" for k in self._where.keys()) params = list(data.values()) + list(where_params)
sql += f" WHERE {conditions}" return sql + where_clause, params
params = list(data.values()) + list(self._where.values())
return sql, params
def build_delete(self): def build_delete(self):
sql = f"DELETE FROM {self.table}" sql = f"DELETE FROM {self.table}"
if self._where: where_clause, params = self._build_where()
conditions = " AND ".join(f"{k} = ?" for k in self._where.keys()) return sql + where_clause, params
sql += f" WHERE {conditions}"
return sql, list(self._where.values())
def first(self): def first(self):