Skip to content

Commit 3eb6ca0

Browse files
committed
feat: wrap table with backticks
1 parent d1a7e2e commit 3eb6ca0

File tree

3 files changed

+38
-38
lines changed

3 files changed

+38
-38
lines changed

README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Generate sql and execute
5757
```sql
5858
SELECT
5959
id, extend ->> '$.last_login.ipv4' ipv4, extend ->> '$.last_login.start_datetime' start_datetime, CAST(extend ->> '$.last_login.online_sec' AS SIGNED) online_sec
60-
FROM account FORCE INDEX (`PRIMARY`)
60+
FROM `account` FORCE INDEX (`PRIMARY`)
6161
WHERE id IN (1,2,3) AND gender=1
6262
```
6363

@@ -79,7 +79,7 @@ Generate sql and execute
7979
```sql
8080
SELECT
8181
locale, gender, COUNT(1) cnt
82-
FROM account
82+
FROM `account`
8383
WHERE `id` BETWEEN 1 AND 12
8484
GROUP BY locale, gender
8585
HAVING cnt > 0
@@ -110,7 +110,7 @@ await AccountMgr.update_json_field(
110110
```
111111
Generate sql and execute
112112
```sql
113-
UPDATE account SET extend =
113+
UPDATE `account` SET extend =
114114
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}}')
115115
WHERE `id`=8
116116
```
@@ -130,13 +130,13 @@ await AccountMgr.upsert_on_duplicate(
130130
```
131131
Generate sql and execute
132132
```sql
133-
INSERT INTO account
133+
INSERT INTO `account`
134134
(id, gender, name, locale, extend)
135135
VALUES
136136
(10, 1, '田中 知実', 'ja_JP', '{"rdm": 1}'),
137137
(11, 2, 'Tara Chadha', 'en_IN', '{"rdm": 10}'),
138138
(12, 2, '吴磊', 'zh_CN', '{"rdm": 9}')
139-
AS `new_account` ON DUPLICATE KEY UPDATE gender=`new_account`.gender, name=`new_account`.name, extend=JSON_MERGE_PATCH(COALESCE(account.extend, '{}'), `new_account`.extend)
139+
AS `new_account` ON DUPLICATE KEY UPDATE gender=`new_account`.gender, name=`new_account`.name, extend=JSON_MERGE_PATCH(COALESCE(`account`.extend, '{}'), `new_account`.extend)
140140
```
141141

142142
### **insert_into_select**
@@ -155,10 +155,10 @@ await AccountMgr.insert_into_select(
155155
```
156156
Generate sql and execute
157157
```sql
158-
INSERT INTO account_bak
158+
INSERT INTO `account_bak`
159159
(gender, locale, active, name, extend)
160160
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
161-
FROM account
161+
FROM `account`
162162
WHERE `id` IN (4,5,6)
163163
```
164164

@@ -176,13 +176,13 @@ await AccountMgr.bulk_update_from_dicts(
176176
```
177177
Generate sql and execute
178178
```sql
179-
UPDATE account
179+
UPDATE `account`
180180
JOIN (
181181
SELECT * FROM (
182182
VALUES
183183
ROW(7, False, 1, '{"test": 1, "debug": 0}'),
184184
ROW(15, True, 0, '{"test": 1, "debug": 0}')
185185
) AS fly_table (id, active, gender, extend)
186-
) tmp ON account.id=tmp.id
187-
SET account.active=tmp.active, account.gender=tmp.gender, account.extend=JSON_MERGE_PATCH(COALESCE(account.extend, '{}'), tmp.extend)
186+
) tmp ON `account`.id=tmp.id
187+
SET `account`.active=tmp.active, `account`.gender=tmp.gender, `account`.extend=JSON_MERGE_PATCH(COALESCE(`account`.extend, '{}'), tmp.extend)
188188
```

fastapi_esql/utils/sqlizer.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def select_custom_fields(
142142
WHERE {}
143143
{}""".format(
144144
", ".join(fields),
145-
table,
145+
wrap_backticks(table),
146146
f" FORCE INDEX (`{index}`)" if index else "",
147147
cls.resolve_wheres(wheres, model),
148148
"\n".join(i for i in extras if i),
@@ -183,7 +183,7 @@ def update_json_field(
183183
json_obj = f"JSON_MERGE_PATCH({json_obj}, {cls.sqlize_value(merge_dict)})"
184184

185185
sql = f"""
186-
UPDATE {table} SET {json_field} =
186+
UPDATE {wrap_backticks(table)} SET {json_field} =
187187
{json_obj}
188188
WHERE {cls.resolve_wheres(wheres, model)}
189189
"""
@@ -216,14 +216,14 @@ def upsert_on_duplicate(
216216
if using_values:
217217
upserts = [f"{field}=VALUES({field})" for field in upsert_fields]
218218
for mf in merge_fields:
219-
dict_obj = f"COALESCE({table}.{mf}, '{{}}')"
219+
dict_obj = f"COALESCE({wrap_backticks(table)}.{mf}, '{{}}')"
220220
upserts.append(f"{mf}=JSON_MERGE_PATCH({dict_obj}, VALUES({mf}))")
221221
on_duplicate = f"ON DUPLICATE KEY UPDATE {', '.join(upserts)}"
222222
else:
223223
new_table = f"`new_{table}`"
224224
upserts = [f"{field}={new_table}.{field}" for field in upsert_fields]
225225
for mf in merge_fields:
226-
dict_obj = f"COALESCE({table}.{mf}, '{{}}')"
226+
dict_obj = f"COALESCE({wrap_backticks(table)}.{mf}, '{{}}')"
227227
upserts.append(f"{mf}=JSON_MERGE_PATCH({dict_obj}, {new_table}.{mf})")
228228
on_duplicate = f"AS {new_table} ON DUPLICATE KEY UPDATE {', '.join(upserts)}"
229229

@@ -233,7 +233,7 @@ def upsert_on_duplicate(
233233
VALUES
234234
{}{}
235235
""".format(
236-
table,
236+
wrap_backticks(table),
237237
", ".join(insert_fields),
238238
",\n".join(values),
239239
f"\n {on_duplicate}" if on_duplicate else "",
@@ -263,10 +263,10 @@ def insert_into_select(
263263
assign_fields.append(f"{cls.sqlize_value(v)} {k}")
264264

265265
sql = f"""
266-
INSERT INTO {to_table or table}
266+
INSERT INTO {wrap_backticks(to_table or table)}
267267
({", ".join(fields)})
268268
SELECT {", ".join(remain_fields + assign_fields)}
269-
FROM {table}
269+
FROM {wrap_backticks(table)}
270270
WHERE {cls.resolve_wheres(wheres, model)}
271271
"""
272272
logger.debug(sql)
@@ -319,15 +319,15 @@ def bulk_update_from_dicts(
319319
if not all([table, dicts, join_fields, update_fields]):
320320
raise WrongParamsError("Parameters `table`, `dicts`, `join_fields`, `update_fields` are required")
321321

322-
joins = [f"{table}.{jf}=tmp.{jf}" for jf in join_fields]
323-
updates = [f"{table}.{uf}=tmp.{uf}" for uf in update_fields]
322+
joins = [f"{wrap_backticks(table)}.{jf}=tmp.{jf}" for jf in join_fields]
323+
updates = [f"{wrap_backticks(table)}.{uf}=tmp.{uf}" for uf in update_fields]
324324
merge_fields = merge_fields or []
325325
for mf in merge_fields:
326-
dict_obj = f"COALESCE({table}.{mf}, '{{}}')"
327-
updates.append(f"{table}.{mf}=JSON_MERGE_PATCH({dict_obj}, tmp.{mf})")
326+
dict_obj = f"COALESCE({wrap_backticks(table)}.{mf}, '{{}}')"
327+
updates.append(f"{wrap_backticks(table)}.{mf}=JSON_MERGE_PATCH({dict_obj}, tmp.{mf})")
328328

329329
sql = f"""
330-
UPDATE {table}
330+
UPDATE {wrap_backticks(table)}
331331
JOIN ({SQLizer.build_fly_table(dicts, join_fields + update_fields + merge_fields, using_values, log_sql=False)}
332332
) tmp ON {", ".join(joins)}
333333
SET {", ".join(updates)}

tests/test_sqlizer.py

+16-16
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def test_select_custom_fields(self):
120120
assert basic_sql == """
121121
SELECT
122122
id, extend ->> '$.last_login.ipv4' ipv4, extend ->> '$.last_login.start_datetime' start_datetime, CAST(extend ->> '$.last_login.online_sec' AS SIGNED) online_sec
123-
FROM account FORCE INDEX (`PRIMARY`)
123+
FROM `account` FORCE INDEX (`PRIMARY`)
124124
WHERE id IN (1,2,3) AND gender=1
125125
"""
126126

@@ -137,7 +137,7 @@ def test_select_custom_fields(self):
137137
assert complex_sql == """
138138
SELECT
139139
locale, gender, COUNT(1) cnt
140-
FROM account
140+
FROM `account`
141141
WHERE `id` BETWEEN 1 AND 12
142142
GROUP BY locale, gender
143143
HAVING cnt > 0
@@ -155,7 +155,7 @@ def test_select_custom_fields(self):
155155
assert paging_sql == """
156156
SELECT
157157
locale, gender
158-
FROM account
158+
FROM `account`
159159
WHERE `id` BETWEEN 1 AND 12
160160
LIMIT 100, 5"""
161161

@@ -195,7 +195,7 @@ def test_update_json_field(self):
195195
model=self.model,
196196
)
197197
assert sql == """
198-
UPDATE account SET extend =
198+
UPDATE `account` SET extend =
199199
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}}')
200200
WHERE `id`=8
201201
"""
@@ -222,13 +222,13 @@ def test_upsert_on_duplicate(self):
222222
using_values=True,
223223
)
224224
assert old_sql == """
225-
INSERT INTO account
225+
INSERT INTO `account`
226226
(id, gender, name, locale, extend)
227227
VALUES
228228
(10, 2, '佐々木 美加子', 'ja_JP', '{"rdm": 6}'),
229229
(11, 0, 'Seher Bumb', 'en_IN', '{"rdm": 4}'),
230230
(12, 0, '谢冬梅', 'zh_CN', '{"rdm": 6}')
231-
ON DUPLICATE KEY UPDATE gender=VALUES(gender), name=VALUES(name), extend=JSON_MERGE_PATCH(COALESCE(account.extend, '{}'), VALUES(extend))
231+
ON DUPLICATE KEY UPDATE gender=VALUES(gender), name=VALUES(name), extend=JSON_MERGE_PATCH(COALESCE(`account`.extend, '{}'), VALUES(extend))
232232
"""
233233

234234
new_sql = SQLizer.upsert_on_duplicate(
@@ -243,13 +243,13 @@ def test_upsert_on_duplicate(self):
243243
merge_fields=["extend"],
244244
)
245245
assert new_sql == """
246-
INSERT INTO account
246+
INSERT INTO `account`
247247
(id, gender, name, locale, extend)
248248
VALUES
249249
(10, 1, '田中 知実', 'ja_JP', '{"rdm": 1}'),
250250
(11, 2, 'Tara Chadha', 'en_IN', '{"rdm": 10}'),
251251
(12, 2, '吴磊', 'zh_CN', '{"rdm": 9}')
252-
AS `new_account` ON DUPLICATE KEY UPDATE gender=`new_account`.gender, name=`new_account`.name, extend=JSON_MERGE_PATCH(COALESCE(account.extend, '{}'), `new_account`.extend)
252+
AS `new_account` ON DUPLICATE KEY UPDATE gender=`new_account`.gender, name=`new_account`.name, extend=JSON_MERGE_PATCH(COALESCE(`account`.extend, '{}'), `new_account`.extend)
253253
"""
254254

255255
only_insert_sql = SQLizer.upsert_on_duplicate(
@@ -262,7 +262,7 @@ def test_upsert_on_duplicate(self):
262262
insert_fields=["id", "gender", "name", "locale", "extend"],
263263
)
264264
assert only_insert_sql == """
265-
INSERT INTO account
265+
INSERT INTO `account`
266266
(id, gender, name, locale, extend)
267267
VALUES
268268
(10, 2, '池田 幹', 'ja_JP', '{"rdm": 9}'),
@@ -293,10 +293,10 @@ def test_insert_into_select(self):
293293
model=self.model,
294294
)
295295
assert archive_sql == """
296-
INSERT INTO account_bak
296+
INSERT INTO `account_bak`
297297
(gender, locale, active, name, extend)
298298
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
299-
FROM account
299+
FROM `account`
300300
WHERE `id` IN (4,5,6)
301301
"""
302302

@@ -313,10 +313,10 @@ def test_insert_into_select(self):
313313
model=self.model,
314314
)
315315
assert copy_sql == """
316-
INSERT INTO account
316+
INSERT INTO `account`
317317
(gender, locale, active, name, extend)
318318
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
319-
FROM account
319+
FROM `account`
320320
WHERE `id` IN (4,5,6)
321321
"""
322322

@@ -377,15 +377,15 @@ def test_bulk_update_from_dicts(self):
377377
merge_fields=["extend"],
378378
)
379379
assert sql == """
380-
UPDATE account
380+
UPDATE `account`
381381
JOIN (
382382
SELECT * FROM (
383383
VALUES
384384
ROW(7, False, 1, '{"test": 1, "debug": 0}'),
385385
ROW(15, True, 0, '{"test": 1, "debug": 0}')
386386
) AS fly_table (id, active, gender, extend)
387-
) tmp ON account.id=tmp.id
388-
SET account.active=tmp.active, account.gender=tmp.gender, account.extend=JSON_MERGE_PATCH(COALESCE(account.extend, '{}'), tmp.extend)
387+
) tmp ON `account`.id=tmp.id
388+
SET `account`.active=tmp.active, `account`.gender=tmp.gender, `account`.extend=JSON_MERGE_PATCH(COALESCE(`account`.extend, '{}'), tmp.extend)
389389
"""
390390

391391
# def test_(self):

0 commit comments

Comments
 (0)