Coverage for src/sqlqb/select.py: 100%
67 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-20 15:56 +0200
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-20 15:56 +0200
1import io
4class Select:
5 def __init__(self, *args):
6 self.__columns = list(args)
7 self.__table = None
8 self.__wheres = []
9 self.__params = []
10 self.__joins = []
11 self.__orderby = []
12 self.__groupby = []
13 self.__limit = None
14 self.__offset = None
16 def Columns(self, *columns) -> "Select":
17 self.__columns = list(columns)
18 return self
20 def From(self, table: str) -> "Select":
21 self.__table = table
22 return self
24 def Join(self, join: str, *args) -> "Select":
25 self.__joins.append(join)
26 self.__params += args
27 return self
29 def Where(self, condition: str, *args) -> "Select":
30 self.__wheres.append(condition)
31 self.__params += args
32 return self
34 def OrderBy(self, column: str, direction="ASC") -> "Select":
35 self.__orderby.append((column, direction))
36 return self
38 def GroupBy(self, *columns) -> "Select":
39 self.__groupby += columns
40 return self
42 def Limit(self, limit: int) -> "Select":
43 self.__limit = limit
44 return self
46 def Offset(self, offset: int) -> "Select":
47 self.__offset = offset
48 return self
50 @property
51 def params(self) -> list:
52 return self.__params
54 @property
55 def sql(self) -> str:
56 sql = io.StringIO()
57 sql.write("SELECT ")
58 sql.write(", ".join(self.__columns or "*"))
59 sql.write(" FROM ")
60 sql.write(self.__table)
61 if self.__joins:
62 sql.write(" ")
63 sql.write(" ".join(self.__joins))
64 if self.__wheres:
65 sql.write(" WHERE ")
66 sql.write(" AND ".join(self.__wheres))
67 if self.__groupby:
68 sql.write(" GROUP BY ")
69 sql.write(", ".join(self.__groupby))
70 if self.__orderby:
71 sql.write(" ORDER BY ")
72 sql.write(", ".join([f"{column} {order}" for column, order in self.__orderby]))
73 if self.__limit is not None:
74 sql.write(f" LIMIT {self.__limit}")
75 if self.__offset is not None:
76 sql.write(f" OFFSET {self.__offset}")
77 return sql.getvalue()
79 def __str__(self) -> str:
80 return self.sql