77)
88
99from examples .service .models .demo import Account
10+ from examples .service .constants .enums import GenderEnum , LocaleEnum
1011
1112
1213class TestRawSQL (TestCase ):
@@ -85,6 +86,21 @@ def test_sqlize_value(self):
8586 assert SQLizer .sqlize_value (datetime (2023 , 1 , 1 , 12 , 30 )) == "'2023-01-01 12:30:00'"
8687
8788 def test_select_custom_fields (self ):
89+ with self .assertRaises (WrongParamsError ):
90+ SQLizer .select_custom_fields (
91+ "" ,
92+ fields = ["locale" , "gender" ],
93+ wheres = Q (id__range = [1 , 12 ]),
94+ )
95+
96+ with self .assertRaises (WrongParamsError ):
97+ SQLizer .select_custom_fields (
98+ self .table ,
99+ fields = ["locale" , "gender" ],
100+ wheres = Q (id__range = [1 , 12 ]),
101+ having = "cnt > 0" ,
102+ )
103+
88104 aids = [1 , 2 , 3 ]
89105 basic_sql = SQLizer .select_custom_fields (
90106 self .table ,
@@ -105,9 +121,7 @@ def test_select_custom_fields(self):
105121
106122 complex_sql = SQLizer .select_custom_fields (
107123 self .table ,
108- fields = [
109- "locale" , "gender" , "COUNT(1) cnt"
110- ],
124+ fields = ["locale" , "gender" , "COUNT(1) cnt" ],
111125 wheres = Q (id__range = [1 , 12 ]),
112126 groups = ["locale" , "gender" ],
113127 having = "cnt > 0" ,
@@ -127,9 +141,7 @@ def test_select_custom_fields(self):
127141
128142 paging_sql = SQLizer .select_custom_fields (
129143 self .table ,
130- fields = [
131- "locale" , "gender"
132- ],
144+ fields = ["locale" , "gender" ],
133145 wheres = Q (id__range = [1 , 12 ]),
134146 offset = 100 ,
135147 limit = 5 ,
@@ -141,3 +153,217 @@ def test_select_custom_fields(self):
141153 FROM account
142154 WHERE `id` BETWEEN 1 AND 12
143155 LIMIT 100, 5"""
156+
157+ def test_update_json_field (self ):
158+ with self .assertRaises (WrongParamsError ):
159+ SQLizer .update_json_field (
160+ self .table ,
161+ json_field = "" ,
162+ wheres = Q (id = 8 ),
163+ )
164+
165+ with self .assertRaises (WrongParamsError ):
166+ SQLizer .update_json_field (
167+ self .table ,
168+ json_field = "extend" ,
169+ wheres = Q (id = 8 ),
170+ )
171+
172+ sql = SQLizer .update_json_field (
173+ self .table ,
174+ json_field = "extend" ,
175+ wheres = Q (id = 8 ),
176+ merge_dict = {
177+ "updated_at" : "2022-10-30 21:34:15" ,
178+ "info" : {
179+ "online_sec" : 636 ,
180+ }
181+ },
182+ path_value_dict = {
183+ "$.last_login" : {
184+ "ipv4" : "209.182.101.161" ,
185+ },
186+ "$.uuid" : "fd04f7f2-24fc-4a73-a1d7-b6e99a464c5f" ,
187+ },
188+ remove_paths = ["$.deprecated" ],
189+ json_type = dict ,
190+ model = self .model ,
191+ )
192+ assert sql == """
193+ UPDATE account SET extend =
194+ JSON_MERGE_PATCH(JSON_SET(JSON_REMOVE(COALESCE(extend, '{}'), '$.deprecated'), '$.last_login',CAST('{"ipv4": "209.182.101.161"}' AS JSON), '$.uuid','fd04f7f2-24fc-4a73-a1d7-b6e99a464c5f'), '{"updated_at": "2022-10-30 21:34:15", "info": {"online_sec": 636}}')
195+ WHERE `id`=8
196+ """
197+
198+ def test_upsert_on_duplicate (self ):
199+ with self .assertRaises (WrongParamsError ):
200+ SQLizer .upsert_on_duplicate (
201+ self .table ,
202+ [],
203+ insert_fields = ["id" , "gender" , "name" , "locale" , "extend" ],
204+ upsert_fields = ["name" , "locale" ],
205+ )
206+
207+ old_sql = SQLizer .upsert_on_duplicate (
208+ self .table ,
209+ [
210+ {'id' : 7 , 'gender' : 1 , 'name' : '斉藤 修平' , 'locale' : 'ja_JP' , 'extend' : {}},
211+ {'id' : 8 , 'gender' : 1 , 'name' : 'Ojas Salvi' , 'locale' : 'en_IN' , 'extend' : {}},
212+ {'id' : 9 , 'gender' : 1 , 'name' : '羊淑兰' , 'locale' : 'zh_CN' , 'extend' : {}}
213+ ],
214+ insert_fields = ["id" , "gender" , "name" , "locale" , "extend" ],
215+ upsert_fields = ["name" , "locale" ],
216+ using_values = True ,
217+ )
218+ assert old_sql == """
219+ INSERT INTO account
220+ (id, gender, name, locale, extend)
221+ VALUES
222+ (7, 1, '斉藤 修平', 'ja_JP', '{}'),
223+ (8, 1, 'Ojas Salvi', 'en_IN', '{}'),
224+ (9, 1, '羊淑兰', 'zh_CN', '{}')
225+ ON DUPLICATE KEY UPDATE name=VALUES(name), locale=VALUES(locale)
226+ """
227+
228+ new_sql = SQLizer .upsert_on_duplicate (
229+ self .table ,
230+ [
231+ {'id' : 7 , 'gender' : 1 , 'name' : '斉藤 修平' , 'locale' : 'ja_JP' , 'extend' : {}},
232+ {'id' : 8 , 'gender' : 1 , 'name' : 'Ojas Salvi' , 'locale' : 'en_IN' , 'extend' : {}},
233+ {'id' : 9 , 'gender' : 1 , 'name' : '羊淑兰' , 'locale' : 'zh_CN' , 'extend' : {}}
234+ ],
235+ insert_fields = ["id" , "gender" , "name" , "locale" , "extend" ],
236+ upsert_fields = ["name" , "locale" ],
237+ using_values = False ,
238+ )
239+ assert new_sql == """
240+ INSERT INTO account
241+ (id, gender, name, locale, extend)
242+ VALUES
243+ (7, 1, '斉藤 修平', 'ja_JP', '{}'),
244+ (8, 1, 'Ojas Salvi', 'en_IN', '{}'),
245+ (9, 1, '羊淑兰', 'zh_CN', '{}')
246+ AS `new_account` ON DUPLICATE KEY UPDATE name=`new_account`.name, locale=`new_account`.locale
247+ """
248+
249+ def test_insert_into_select (self ):
250+ with self .assertRaises (WrongParamsError ):
251+ SQLizer .insert_into_select (
252+ self .table ,
253+ wheres = Q (id__in = [4 , 5 , 6 ]),
254+ remain_fields = [],
255+ assign_field_dict = {},
256+ )
257+
258+ archive_sql = SQLizer .insert_into_select (
259+ self .table ,
260+ wheres = Q (id__in = [4 , 5 , 6 ]),
261+ remain_fields = ["gender" ],
262+ assign_field_dict = {
263+ "locale" : Cases ("id" , {3 : LocaleEnum .zh_CN , 4 : LocaleEnum .en_US , 5 : LocaleEnum .fr_FR }, default = "" ),
264+ "active" : False ,
265+ "name" : RawSQL ("CONCAT(LEFT(name, 26), ' [NEW]')" ),
266+ "extend" : {},
267+ },
268+ to_table = "account_bak" ,
269+ model = self .model ,
270+ )
271+ assert archive_sql == """
272+ INSERT INTO account_bak
273+ (gender, locale, active, name, extend)
274+ SELECT gender, CASE id WHEN 3 THEN 'zh_CN' WHEN 4 THEN 'en_US' WHEN 5 THEN 'fr_FR' ELSE '' END locale, False active, CONCAT(LEFT(name, 26), ' [NEW]') name, '{}' extend
275+ FROM account
276+ WHERE `id` IN (4,5,6)
277+ """
278+
279+ copy_sql = SQLizer .insert_into_select (
280+ self .table ,
281+ wheres = Q (id__in = [4 , 5 , 6 ]),
282+ remain_fields = ["gender" ],
283+ assign_field_dict = {
284+ "locale" : Cases ("id" , {3 : LocaleEnum .zh_CN , 4 : LocaleEnum .en_US , 5 : LocaleEnum .fr_FR }, default = "" ),
285+ "active" : False ,
286+ "name" : RawSQL ("CONCAT(LEFT(name, 26), ' [NEW]')" ),
287+ "extend" : {},
288+ },
289+ model = self .model ,
290+ )
291+ assert copy_sql == """
292+ INSERT INTO account
293+ (gender, locale, active, name, extend)
294+ SELECT gender, CASE id WHEN 3 THEN 'zh_CN' WHEN 4 THEN 'en_US' WHEN 5 THEN 'fr_FR' ELSE '' END locale, False active, CONCAT(LEFT(name, 26), ' [NEW]') name, '{}' extend
295+ FROM account
296+ WHERE `id` IN (4,5,6)
297+ """
298+
299+ def test_build_fly_table (self ):
300+ with self .assertRaises (WrongParamsError ):
301+ SQLizer .build_fly_table (
302+ [],
303+ fields = ["id" , "active" , "gender" ],
304+ )
305+
306+ old_sql = SQLizer .build_fly_table (
307+ [
308+ {'id' : 7 , 'active' : False , 'gender' : GenderEnum .male },
309+ {'id' : 15 , 'active' : True , 'gender' : GenderEnum .unknown }
310+ ],
311+ fields = ["id" , "active" , "gender" ],
312+ using_values = False ,
313+ )
314+ assert old_sql == """
315+ SELECT * FROM (
316+ SELECT 7 id, False active, 1 gender
317+ UNION
318+ SELECT 15 id, True active, 0 gender
319+ ) AS fly_table"""
320+
321+ new_sql = SQLizer .build_fly_table (
322+ [
323+ {'id' : 7 , 'active' : False , 'gender' : GenderEnum .male },
324+ {'id' : 15 , 'active' : True , 'gender' : GenderEnum .unknown }
325+ ],
326+ fields = ["id" , "active" , "gender" ],
327+ using_values = True ,
328+ )
329+ assert new_sql == """
330+ SELECT * FROM (
331+ VALUES
332+ ROW(7, False, 1),
333+ ROW(15, True, 0)
334+ ) AS fly_table (id, active, gender)"""
335+
336+ def test_bulk_update_from_dicts (self ):
337+ with self .assertRaises (WrongParamsError ):
338+ SQLizer .bulk_update_from_dicts (
339+ self .table ,
340+ [],
341+ join_fields = ["id" ],
342+ update_fields = ["active" , "gender" ],
343+ )
344+
345+ sql = SQLizer .bulk_update_from_dicts (
346+ self .table ,
347+ [
348+ {'id' : 7 , 'active' : False , 'gender' : GenderEnum .male },
349+ {'id' : 15 , 'active' : True , 'gender' : GenderEnum .unknown }
350+ ],
351+ join_fields = ["id" ],
352+ update_fields = ["active" , "gender" ],
353+ )
354+ assert sql == """
355+ UPDATE account
356+ JOIN (
357+ SELECT * FROM (
358+ VALUES
359+ ROW(7, False, 1),
360+ ROW(15, True, 0)
361+ ) AS fly_table (id, active, gender)
362+ ) tmp ON account.id=tmp.id
363+ SET account.active=tmp.active, account.gender=tmp.gender
364+ """
365+
366+ # def test_(self):
367+ # sql = SQLizer()
368+ # assert sql == """
369+ # """
0 commit comments