@@ -142,18 +142,20 @@ def __str__(self) -> str:
142142 return self .querystring .__str__ ()
143143
144144
145- @dataclass
146- class OrderByRaw :
147- __slots__ = ("sql" ,)
145+ class OrderByRaw (QueryString ):
146+ """
147+ Here for backwards compatibility - just use
148+ :class:`piccolo.querystring.QueryString` directly.
149+ """
148150
149- sql : str
151+ pass
150152
151153
152154@dataclass
153155class OrderByItem :
154156 __slots__ = ("columns" , "ascending" )
155157
156- columns : Sequence [Union [Column , OrderByRaw ]]
158+ columns : Sequence [Union [Column , QueryString ]]
157159 ascending : bool
158160
159161
@@ -164,19 +166,24 @@ class OrderBy:
164166 @property
165167 def querystring (self ) -> QueryString :
166168 order_by_strings : list [str ] = []
169+ querystring_args = []
167170 for order_by_item in self .order_by_items :
168171 order = "ASC" if order_by_item .ascending else "DESC"
169172 for column in order_by_item .columns :
170173 if isinstance (column , Column ):
171174 expression = column ._meta .get_full_name (with_alias = False )
172- elif isinstance (column , OrderByRaw ):
173- expression = column .sql
175+ elif isinstance (column , QueryString ):
176+ expression = "{}"
177+ querystring_args .append (column )
174178 else :
175179 raise ValueError ("Unrecognised order_by" )
176180
177181 order_by_strings .append (f"{ expression } { order } " )
178182
179- return QueryString (f" ORDER BY { ', ' .join (order_by_strings )} " )
183+ return QueryString (
184+ f" ORDER BY { ', ' .join (order_by_strings )} " ,
185+ * querystring_args ,
186+ )
180187
181188 def __str__ (self ):
182189 return self .querystring .__str__ ()
@@ -291,7 +298,7 @@ def get_order_by_columns(self) -> list[Column]:
291298 if isinstance (i , Column )
292299 ]
293300
294- def order_by (self , * columns : Union [Column , OrderByRaw ], ascending = True ):
301+ def order_by (self , * columns : Union [Column , QueryString ], ascending = True ):
295302 if len (columns ) < 1 :
296303 raise ValueError ("At least one column must be passed to order_by." )
297304
@@ -592,33 +599,31 @@ def offset(self, number: int = 0):
592599 self ._offset = Offset (number )
593600
594601
595- @dataclass
596- class GroupByRaw :
597- __slots__ = ("sql" ,)
598-
599- sql : str
600-
601-
602602@dataclass
603603class GroupBy :
604604 __slots__ = ("columns" ,)
605605
606- columns : Sequence [Union [Column , GroupByRaw ]]
606+ columns : Sequence [Union [Column , QueryString ]]
607607
608608 @property
609609 def querystring (self ) -> QueryString :
610610 column_names : list [str ] = []
611+ querystring_args = []
611612 for column in self .columns :
612613 if isinstance (column , Column ):
613614 column_names .append (
614615 column ._meta .get_full_name (with_alias = False )
615616 )
616- elif isinstance (column , GroupByRaw ):
617- column_names .append (column .sql )
617+ elif isinstance (column , QueryString ):
618+ column_names .append ("{}" )
619+ querystring_args .append (column )
618620 else : # pragma: no cover
619621 raise ValueError ("Unrecognised group_by" )
620622
621- return QueryString (f" GROUP BY { ', ' .join (column_names )} " )
623+ return QueryString (
624+ f" GROUP BY { ', ' .join (column_names )} " ,
625+ * querystring_args ,
626+ )
622627
623628 def __str__ (self ):
624629 return self .querystring .__str__ ()
@@ -635,7 +640,7 @@ class GroupByDelegate:
635640
636641 _group_by : Optional [GroupBy ] = None
637642
638- def group_by (self , * columns : Union [Column , GroupByRaw ]):
643+ def group_by (self , * columns : Union [Column , QueryString ]):
639644 self ._group_by = GroupBy (columns = columns )
640645
641646
0 commit comments