support lists of tuples in QueryBuilder
This commit is contained in:
		
							
								
								
									
										45
									
								
								app/db.py
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								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):
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user