Skip to content

Commit 4e18963

Browse files
committed
test: TestSQLizer finished
1 parent 698539f commit 4e18963

File tree

2 files changed

+239
-10
lines changed

2 files changed

+239
-10
lines changed

fastapi_esql/utils/sqlizer.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ def update_json_field(
180180
sql = f"""
181181
UPDATE {table} SET {json_field} =
182182
{json_obj}
183-
WHERE {cls.resolve_wheres(wheres, model)}"""
183+
WHERE {cls.resolve_wheres(wheres, model)}
184+
"""
184185
logger.debug(sql)
185186
return sql
186187

@@ -216,7 +217,7 @@ def upsert_on_duplicate(
216217
VALUES
217218
{}
218219
{}
219-
""".format(
220+
""".format(
220221
table,
221222
", ".join(insert_fields),
222223
",\n".join(values),
@@ -249,7 +250,8 @@ def insert_into_select(
249250
({", ".join(fields)})
250251
SELECT {", ".join(remain_fields + assign_fields)}
251252
FROM {table}
252-
WHERE {cls.resolve_wheres(wheres, model)}"""
253+
WHERE {cls.resolve_wheres(wheres, model)}
254+
"""
253255
logger.debug(sql)
254256
return sql
255257

@@ -304,6 +306,7 @@ def bulk_update_from_dicts(
304306
UPDATE {table}
305307
JOIN ({SQLizer.build_fly_table(dicts, join_fields + update_fields, using_values)}
306308
) tmp ON {", ".join(joins)}
307-
SET {", ".join(updates)}"""
309+
SET {", ".join(updates)}
310+
"""
308311
logger.debug(sql)
309312
return sql

tests/test_sqlizer.py

Lines changed: 232 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
)
88

99
from examples.service.models.demo import Account
10+
from examples.service.constants.enums import GenderEnum, LocaleEnum
1011

1112

1213
class 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

Comments
 (0)