66 Q , QsParsingError , WrongParamsError ,
77)
88
9- from . import init_test_orm
109from examples .service .models .demo import Account
1110
1211
@@ -33,6 +32,9 @@ def test_no_default(self):
3332
3433class TestSQLizer (TestCase ):
3534
35+ model = Account
36+ table = Account .Meta .table
37+
3638 def test_resolve_wheres (self ):
3739 with self .assertRaises (WrongParamsError ):
3840 SQLizer .resolve_wheres (object ())
@@ -41,22 +43,21 @@ def test_resolve_wheres(self):
4143 assert SQLizer .resolve_wheres (
4244 f"id IN ({ ',' .join (map (str , aids ))} ) AND gender=1"
4345 ) == "id IN (1,2,3) AND gender=1"
44- init_test_orm ()
4546 assert SQLizer .resolve_wheres (
46- Q (Q (id__in = aids ), Q (gender = 1 ), join_type = "AND" ), Account
47+ Q (Q (id__in = aids ), Q (gender = 1 ), join_type = "AND" ), self . model
4748 ) == "`id` IN (1,2,3) AND `gender`=1"
4849 assert SQLizer .resolve_wheres (
49- {"id__in" : aids , "gender" : 1 }, Account
50+ {"id__in" : aids , "gender" : 1 }, self . model
5051 ) == "`id` IN (1,2,3) AND `gender`=1"
5152 assert SQLizer .resolve_wheres (
52- [Q (id__in = aids ), Q (gender = 1 )], Account
53+ [Q (id__in = aids ), Q (gender = 1 )], self . model
5354 ) == "`id` IN (1,2,3) AND `gender`=1"
5455
5556 with self .assertRaises (WrongParamsError ):
5657 SQLizer .resolve_wheres (set ())
5758
5859 with self .assertRaises (QsParsingError ):
59- SQLizer .resolve_wheres ({}, Account )
60+ SQLizer .resolve_wheres ({}, self . model )
6061
6162 def test_resolve_orders (self ):
6263 orders = SQLizer .resolve_orders (["-created_at" , "name" ])
@@ -82,3 +83,61 @@ def test_sqlize_value(self):
8283 assert SQLizer .sqlize_value (("a" , "b" , "c" )) == """'["a", "b", "c"]'"""
8384
8485 assert SQLizer .sqlize_value (datetime (2023 , 1 , 1 , 12 , 30 )) == "'2023-01-01 12:30:00'"
86+
87+ def test_select_custom_fields (self ):
88+ aids = [1 , 2 , 3 ]
89+ basic_sql = SQLizer .select_custom_fields (
90+ self .table ,
91+ fields = [
92+ "id" , "extend ->> '$.last_login.ipv4' ipv4" ,
93+ "extend ->> '$.last_login.start_datetime' start_datetime" ,
94+ "CAST(extend ->> '$.last_login.online_sec' AS SIGNED) online_sec"
95+ ],
96+ wheres = f"id IN ({ ',' .join (map (str , aids ))} ) AND gender=1" ,
97+ model = self .model ,
98+ )
99+ assert basic_sql == """
100+ SELECT
101+ id, extend ->> '$.last_login.ipv4' ipv4, extend ->> '$.last_login.start_datetime' start_datetime, CAST(extend ->> '$.last_login.online_sec' AS SIGNED) online_sec
102+ FROM account
103+ WHERE id IN (1,2,3) AND gender=1
104+ """
105+
106+ complex_sql = SQLizer .select_custom_fields (
107+ self .table ,
108+ fields = [
109+ "locale" , "gender" , "COUNT(1) cnt"
110+ ],
111+ wheres = Q (id__range = [1 , 12 ]),
112+ groups = ["locale" , "gender" ],
113+ having = "cnt > 0" ,
114+ orders = ["locale" , "-gender" ],
115+ limit = 10 ,
116+ model = self .model ,
117+ )
118+ assert complex_sql == """
119+ SELECT
120+ locale, gender, COUNT(1) cnt
121+ FROM account
122+ WHERE `id` BETWEEN 1 AND 12
123+ GROUP BY locale, gender
124+ HAVING cnt > 0
125+ ORDER BY locale ASC, gender DESC
126+ LIMIT 10"""
127+
128+ paging_sql = SQLizer .select_custom_fields (
129+ self .table ,
130+ fields = [
131+ "locale" , "gender"
132+ ],
133+ wheres = Q (id__range = [1 , 12 ]),
134+ offset = 100 ,
135+ limit = 5 ,
136+ model = self .model ,
137+ )
138+ assert paging_sql == """
139+ SELECT
140+ locale, gender
141+ FROM account
142+ WHERE `id` BETWEEN 1 AND 12
143+ LIMIT 100, 5"""
0 commit comments