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:
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):