pilot.linkstec 0.0.32__py3-none-any.whl → 0.0.91__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. pilot/base/__init__.py +0 -0
  2. pilot/base/ai_call.py +38 -0
  3. pilot/base/ai_info.py +20 -0
  4. pilot/base/chage_file_tag_base.py +73 -0
  5. pilot/base/db_operation_base.py +536 -0
  6. pilot/base/delete_commnents_base.py +306 -0
  7. pilot/base/file_operation.py +44 -0
  8. pilot/base/get_file_encoding.py +14 -0
  9. pilot/base/make_parsing_java_file_order_base.py +154 -0
  10. pilot/base/split_file_base.py +256 -0
  11. pilot/client/__init__.py +0 -0
  12. pilot/client/ai_client.py +75 -0
  13. pilot/config/config_reader.py +81 -43
  14. pilot/create_python/__init__.py +0 -0
  15. pilot/create_python/config/__init__.py +0 -0
  16. pilot/create_python/create_python.py +150 -0
  17. pilot/create_python/sample/__init__.py +0 -0
  18. pilot/create_python/sample/child_sample/__init__.py +0 -0
  19. pilot/create_python/sample/child_sample/job/__init__.py +0 -0
  20. pilot/create_python/sample/config/__init__.py +0 -0
  21. pilot/db/__init__.py +0 -0
  22. pilot/db/create_table.py +34 -0
  23. pilot/db/db_connect.py +49 -0
  24. pilot/db/db_main.py +293 -0
  25. pilot/db/db_util.py +508 -0
  26. pilot/db/ddl/__init__.py +18 -0
  27. pilot/db/dml/__init__.py +18 -0
  28. pilot/db/sql_executor.py +62 -0
  29. pilot/db/sql_loader.py +233 -0
  30. pilot/db/sql_service.py +55 -0
  31. pilot/file_tool/__init__.py +0 -0
  32. pilot/file_tool/create_prompt_file.py +75 -0
  33. pilot/file_tool/json_file_tool.py +103 -0
  34. pilot/job/base/__init__.py +0 -0
  35. pilot/job/base/convert/__init__.py +0 -0
  36. pilot/job/base/convert/encodingTransformerJob.py +16 -0
  37. pilot/job/base/convert/tabReplaceJob.py +27 -0
  38. pilot/job/base/generate/__init__.py +0 -0
  39. pilot/job/base/generate/generateJsonBaseJob.py +42 -0
  40. pilot/job/base/generate/generateTextBaseJob.py +40 -0
  41. pilot/job/impl/base_job.py +4 -0
  42. pilot/prompt/__init__.py +0 -0
  43. pilot/unit/impl/base_unit.py +1 -0
  44. {pilot_linkstec-0.0.32.dist-info → pilot_linkstec-0.0.91.dist-info}/METADATA +1 -1
  45. pilot_linkstec-0.0.91.dist-info/RECORD +75 -0
  46. pilot_linkstec-0.0.32.dist-info/RECORD +0 -35
  47. {pilot_linkstec-0.0.32.dist-info → pilot_linkstec-0.0.91.dist-info}/WHEEL +0 -0
  48. {pilot_linkstec-0.0.32.dist-info → pilot_linkstec-0.0.91.dist-info}/licenses/LICENSE +0 -0
  49. {pilot_linkstec-0.0.32.dist-info → pilot_linkstec-0.0.91.dist-info}/top_level.txt +0 -0
pilot/db/db_util.py ADDED
@@ -0,0 +1,508 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ db_util.py
4
+ 通用的 INSERT 工具,根據「INSERT_MAP」把傳入的 dict 轉成
5
+ (sql_file_path, dml_params) 並呼叫 exec_dml()
6
+ """
7
+ import pathlib
8
+ import re
9
+ import sqlite3
10
+ from typing import Callable, Dict, Any, List
11
+
12
+ from db.sql_executor import exec_dml
13
+
14
+ # -------------------------------------------------
15
+ # 2️⃣ INSERT_MAP
16
+ # key : 給外部呼叫的函式名稱(或任何自訂代號)
17
+ # value : {
18
+ # "sql_path" : r'ddl\INSERT_XXXXX.sql',
19
+ # # 必要欄位的清單(若有額外固定值,可直接寫在 dict 內)
20
+ # "fields" : ["package_name", "file_name", ...],
21
+ # # 需要額外固定值時(例如 comment_file_path),寫在這裡
22
+ # "defaults" : {"comment_file_path": "XXXX"},
23
+ # }
24
+ # -------------------------------------------------
25
+ INSERT_MAP: Dict[str, Dict[str, Any]] = {
26
+ # ------------------- method 系列 -------------------
27
+ "method_file_info": {
28
+ "sql_path": r"dml\INSERT_METHOD_FILE_INFO.sql",
29
+ "fields": [
30
+ "package_name", "class_name","file_name","original_file_path",
31
+ "no_comment_file_path"
32
+ ],
33
+ },
34
+ "method_class_info": {
35
+ "sql_path": r"dml\INSERT_METHOD_CLASS_INFO.sql",
36
+ "fields": [
37
+ "package_name", "file_name", "class_name", "class_type",
38
+ "full_class_name", "import_object_name"
39
+ ],
40
+ },
41
+ "method_info": {
42
+ "sql_path": r"dml\INSERT_METHOD_INFO.sql",
43
+ "fields": [
44
+ "package_name", "file_name", "class_name", "method_name",
45
+ "full_method_signature", "return_type", "remaining_class_code"
46
+ ],
47
+ },
48
+ "method_parameter_info": {
49
+ "sql_path": r"dml\INSERT_METHOD_PARAMETER_INFO.sql",
50
+ "fields": [
51
+ "package_name", "file_name", "class_name", "method_name",
52
+ "parameter_type", "parameter_name"
53
+ ],
54
+ },
55
+ "sub_method_info": {
56
+ "sql_path": r"dml\INSERT_METHOD_SUB_METHOD_INFO.sql",
57
+ "fields": [
58
+ "package_name", "file_name", "class_name", "method_name",
59
+ "sub_method_name", "called_method_full_signature", "called_method_class"
60
+ ],
61
+ },
62
+ "method_parsing_info": {
63
+ "sql_path": r"dml\INSERT_METHOD_PARSING_INFO.sql",
64
+ "fields": [
65
+ "package_name", "class_name", "method_name", "method_description",
66
+ "input_parameter_info", "return_value_info", "code_with_comment_info",
67
+ "parsing_method_info_file_path"
68
+ ],
69
+ },
70
+
71
+ # ------------------- sql 系列 -------------------
72
+ "sql_file_info": {
73
+ "sql_path": r"dml\INSERT_SQL_FILE_INFO.sql",
74
+ "fields": [
75
+ "mapper_file_name","original_file_path","no_comment_file_path"
76
+ ],
77
+ },
78
+ "sql_content_info": {
79
+ "sql_path": r"dml\INSERT_SQL_CONTENT_INFO.sql",
80
+ "fields": ["sql_mapper_name","sql_id","sql_content"],
81
+ },
82
+ "sql_table_info": {
83
+ "sql_path": r"dml\INSERT_SQL_TABLE_INFO.sql",
84
+ "fields": ["sql_mapper_name","sql_id","sql_style","mapper_file_name","table_name","table_alias"],
85
+ },
86
+ "sql_condition_info": {
87
+ "sql_path": r"dml\INSERT_SQL_CONDITION_INFO.sql",
88
+ "fields": ["sql_mapper_name","sql_id","sql_style","mapper_file_name","condition_content"],
89
+ },
90
+ "sql_parameter_info": {
91
+ "sql_path": r"dml\INSERT_SQL_PARAMETER_INFO.sql",
92
+ "fields": ["sql_mapper_name","sql_id","sql_style","mapper_file_name",
93
+ "parameter_name","parameter_column_name","parameter_table_name","parameter_table_alias"],
94
+ },
95
+ "sql_column_info": {
96
+ "sql_path": r"dml\INSERT_SQL_COLUMN_INFO.sql",
97
+ "fields": ["sql_mapper_name","sql_id","sql_style","mapper_file_name","table_name",
98
+ "table_alias","sql_type","column_name","column_alias"],
99
+ },
100
+ "sql_parsing_info": {
101
+ "sql_path": r"dml\INSERT_SQL_PARSING_INFO.sql",
102
+ "fields": ["sql_mapper_name","sql_id","in_parameter_info","output_info","sql_description",
103
+ "sql_content","parsing_file_path"],
104
+ },
105
+ "table_info": {
106
+ "sql_path": r"dml\INSERT_TABLE_INFO.sql",
107
+ "fields": ["table_id","table_name"],
108
+ },
109
+ "table_column_info": {
110
+ "sql_path": r"dml\INSERT_TABLE_COLUMN_INFO.sql",
111
+ "fields": ["table_id","column_id","column_name"],
112
+ },
113
+ }
114
+
115
+ SELECT_MAP: Dict[str, Dict[str, Any]] = {
116
+ # ------------------- method 系列 -------------------
117
+ "method_file_info": {
118
+ "sql_path": r"dml\SELECT_METHOD_FILE_INFO.sql",
119
+ "fields": [
120
+ "file_name"
121
+ ],
122
+ },
123
+ "method_class_info": {
124
+ "sql_path": r"dml\SELECT_METHOD_CLASS_INFO.sql",
125
+ "fields": [
126
+ "package_name",
127
+ "class_name",
128
+ ],
129
+ },
130
+ "method_info": {
131
+ "sql_path": r"dml\SELECT_METHOD_INFO_BY_KEY.sql",
132
+ "fields": [
133
+ "package_name",
134
+ "class_name",
135
+ "method_name",
136
+ ],
137
+ },
138
+ "method_parameter_info": {
139
+ "sql_path": r"dml\SELECT_METHOD_PARAMETER_INFO.sql",
140
+ "fields": [
141
+ "package_name",
142
+ "class_name",
143
+ "method_name",
144
+ ],
145
+ },
146
+ "method_sub_method_info": {
147
+ "sql_path": r"dml\SELECT_METHOD_SUB_METHOD_INFO.sql",
148
+ "fields": [
149
+ "package_name",
150
+ "class_name",
151
+ "method_name",
152
+ ],
153
+ },
154
+ # ------------------- sql 系列 -------------------
155
+ "sql_file_info": {
156
+ "sql_path": r"dml\SELECT_SQL_FILE_INFO.sql",
157
+ "fields": [
158
+ "sql_id"
159
+ ],
160
+ },
161
+ "sql_table_info": {
162
+ "sql_path": r"dml\SELECT_SQL_TABLE_INFO.sql",
163
+ "fields": [
164
+ "sql_mapper_name",
165
+ "sql_id"
166
+ ],
167
+ },
168
+ "sql_condition_info": {
169
+ "sql_path": r"dml\SELECT_SQL_CONDITION_INFO.sql",
170
+ "fields": [
171
+ "sql_mapper_name",
172
+ "sql_id"
173
+ ],
174
+ },
175
+ "sql_content_info_list": {
176
+ "sql_path": r"dml\SELECT_SQL_CONTENT_INFO_LIST.sql",
177
+ "fields": [
178
+ None
179
+ ],
180
+ },
181
+ "sql_parameter_info": {
182
+ "sql_path": r"dml\SELECT_SQL_PARAMETER_INFO.sql",
183
+ "fields": [
184
+ "sql_mapper_name",
185
+ "sql_id"
186
+ ],
187
+ },
188
+ "sql_column_info": {
189
+ "sql_path": r"dml\SELECT_SQL_COLUMN_INFO.sql",
190
+ "fields": [
191
+ "sql_mapper_name",
192
+ "sql_id"
193
+ ],
194
+ },
195
+ "sql_content_info": {
196
+ "sql_path": r"dml\SELECT_SQL_CONTENT_INFO.sql",
197
+ "fields": [
198
+ "sql_mapper_name",
199
+ "sql_id"
200
+ ],
201
+ },
202
+ "sql_get_parsing_sql_info_list": {
203
+ "sql_path": r"dml\SELECT_SQL_PARSING_INFO.sql",
204
+ "fields": [
205
+ "package_name",
206
+ "class_name",
207
+ "method_name",
208
+ ],
209
+ },
210
+ # ------------------- method 系列 -------------------
211
+ "sql_no_sub_method_info": {
212
+ "sql_path": r"dml\SELECT_METHOD_NO_SUB_METHOD_INFO.sql",
213
+ "fields": [
214
+ None
215
+ ],
216
+ },
217
+ "sql_get_sub_method_info_all_list": {
218
+ "sql_path": r"dml\SELECT_METHOD_SUB_METHOD_INFO_ALL_LIST.sql",
219
+ "fields": [
220
+ "values_str"
221
+ ],
222
+ },
223
+ "sql_get_dao_method_info": {
224
+ "sql_path": r"dml\SELECT_METHOD_INFO_BY_KEY.sql",
225
+ "fields": [
226
+ "package_name",
227
+ "class_name",
228
+ "method_name",
229
+ ],
230
+ },
231
+ "sql_get_sub_method_info_list": {
232
+ "sql_path": r"dml\SELECT_METHOD_SUB_METHOD_INFO.sql",
233
+ "fields": [
234
+ "package_name",
235
+ "class_name",
236
+ "method_name",
237
+ ],
238
+ },
239
+ "sql_get_parsing_java_info_list": {
240
+ "sql_path": r"dml\SELECT_METHOD_PARSING_INFO.sql",
241
+ "fields": [
242
+ "package_name",
243
+ "class_name",
244
+ "method_name",
245
+ ],
246
+ },
247
+ # ------------------------SQL PROMPT INFO -------------
248
+ "get_table_info_list": {
249
+ "sql_path": r"dml\SELECT_TABLE_INFO.sql",
250
+ "fields": [
251
+ "sql_mapper_name",
252
+ "sql_id",
253
+ ],
254
+ },
255
+ "get_table_column_info_list": {
256
+ "sql_path": r"dml\SELECT_TABLE_COLUMN_INFO.sql",
257
+ "fields": [
258
+ "sql_mapper_name",
259
+ "sql_id",
260
+ ],
261
+ },
262
+ "get_count_sub_method_info":{
263
+ "sql_path":r"dml\SELECT_COUNT_METHOD_SUB_METHOD_INFO.sql",
264
+ "fields": [
265
+ "sub_method_name",
266
+ "called_method_class",
267
+ ]
268
+ }
269
+ }
270
+
271
+ UPDATE_MAP: Dict[str, Dict[str, Any]] = {
272
+ "update_sql_table_content_info": {
273
+ "sql_path": r"dml\UPDATE_SQL_CONTENT_INFO.sql",
274
+ "fields": [
275
+ "sql_style",
276
+ "sql_mapper_name",
277
+ "sql_id",
278
+ ],
279
+ },
280
+ "update_method_info": {
281
+ "sql_path": r"dml\UPDATE_METHOD_INFO.sql",
282
+ "fields": [
283
+ "package_name",
284
+ "class_name",
285
+ "method_name",
286
+ "return_type"
287
+ ],
288
+ },
289
+
290
+ }
291
+
292
+ DELETE_MAP: Dict[str, Dict[str, Any]] = {
293
+ "delete_method_file_info": {
294
+ "sql_path": r"dml\DELETE_METHOD_FILE_INFO.sql",
295
+ "fields": [
296
+ "package_name",
297
+ "class_name"
298
+ ],
299
+ },
300
+ "delete_method_class_info": {
301
+ "sql_path": r"dml\DELETE_METHOD_CLASS_INFO.sql",
302
+ "fields": [
303
+ "package_name",
304
+ "class_name"
305
+ ],
306
+ },
307
+ "delete_method_info": {
308
+ "sql_path": r"dml\DELETE_METHOD_INFO.sql",
309
+ "fields": [
310
+ "package_name",
311
+ "class_name",
312
+ "method_name"
313
+ ],
314
+ },
315
+ "delete_method_parameter_info":{
316
+ "sql_path": r"dml\DELETE_METHOD_PARAMETER_INFO.sql",
317
+ "fields": [
318
+ "package_name",
319
+ "class_name",
320
+ "method_name"
321
+ ],
322
+ },
323
+ "delete_method_sub_method_info":{
324
+ "sql_path": r"dml\DELETE_METHOD_SUB_METHOD_INFO.sql",
325
+ "fields": [
326
+ "package_name",
327
+ "class_name",
328
+ "method_name"
329
+ ],
330
+ },
331
+ "delete_method_parsing_info":{
332
+ "sql_path": r"dml\DELETE_METHOD_PARSING_INFO.sql",
333
+ "fields": [
334
+ "package_name",
335
+ "class_name",
336
+ "method_name"
337
+ ],
338
+ },
339
+ "delete_sql_content_info":{
340
+ "sql_path": r'dml\DELETE_SQL_CONTENT_INFO.sql',
341
+ "fields": [
342
+ "sql_mapper_name",
343
+ "sql_id"
344
+ ]
345
+ },
346
+ "delete_sql_file_info":{
347
+ "sql_path": r'dml\DELETE_SQL_FILE_INFO.sql',
348
+ "fields": [
349
+ "mapper_file_name"
350
+ ]
351
+ },
352
+ "delete_sql_table_info":{
353
+ "sql_path": r'dml\DELETE_SQL_TABLE_INFO.sql',
354
+ "fields": [
355
+ "sql_mapper_name",
356
+ "sql_id"
357
+ ]
358
+ },
359
+ "delete_sql_condition_info": {
360
+ "sql_path": r'dml\DELETE_SQL_CONDITION_INFO.sql',
361
+ "fields": [
362
+ "sql_mapper_name",
363
+ "sql_id"
364
+ ]
365
+ },
366
+ "delete_sql_column_info_info": {
367
+ "sql_path": r'dml\DELETE_SQL_COLUMN_INFO.sql',
368
+ "fields": [
369
+ "sql_mapper_name",
370
+ "sql_id"
371
+ ]
372
+ },
373
+ "delete_sql_parameter_info": {
374
+ "sql_path": r'dml\DELETE_SQL_PARAMETER_INFO.sql',
375
+ "fields": [
376
+ "sql_mapper_name",
377
+ "sql_id"
378
+ ]
379
+ },
380
+ "delete_sql_parsing_info": {
381
+ "sql_path": r'dml\DELETE_SQL_PARSING_INFO.sql',
382
+ "fields": [
383
+ "sql_mapper_name",
384
+ "sql_id"
385
+ ]
386
+ }
387
+ }
388
+
389
+ # -------------------------------------------------
390
+ # 1 通用執行函式
391
+ # -------------------------------------------------
392
+ def exec_insert(key: str, raw_params: Dict[str, Any]) -> None:
393
+ """
394
+ 依照 INSERT_MAP[key] 把 raw_params 轉成正確的 dml_params,
395
+ 再呼叫 exec_dml()。
396
+
397
+ Parameters
398
+ ----------
399
+ key : str
400
+ INSERT_MAP 中的鍵,例如 "file_info"、"class_info" …
401
+ raw_params : dict
402
+ 呼叫端傳入的參數(可能多於或少於 fields)。
403
+ """
404
+ if key not in INSERT_MAP:
405
+ raise KeyError(f"Insert key '{key}' is not defined in INSERT_MAP")
406
+
407
+ cfg = INSERT_MAP[key]
408
+ sql_path: str = cfg["sql_path"]
409
+ fields: list[str] = cfg.get("fields", [])
410
+ defaults: dict = cfg.get("defaults", {})
411
+
412
+ # 只挑出需要的欄位,缺少的會以 None 填充
413
+ dml_params: dict = {f: raw_params.get(f) for f in fields}
414
+ # 合併固定值(例如 comment_file_path = "XXXX")
415
+ dml_params.update(defaults)
416
+
417
+ exec_dml(sql_path, dml_params)
418
+
419
+ # -------------------------------------------------
420
+ # 2 通用執行函式
421
+ # -------------------------------------------------
422
+ def exec_select(key:str, sel_params: Dict[str, Any]):
423
+ """
424
+ 依照 SELECT_MAP[key] 把 sel_params 轉成正確的 dml_params,
425
+ 再呼叫 exec_dml()。
426
+
427
+ Parameters
428
+ ----------
429
+ key : str
430
+ SELECT_MAP 中的鍵,例如 "file_info"、"class_info" …
431
+ sel_params : dict
432
+ 呼叫端傳入的參數(可能多於或少於 fields)。
433
+ """
434
+ if key not in SELECT_MAP:
435
+ raise KeyError(f"Select key '{key}' is not defined in SELECT_MAP")
436
+
437
+ cfg = SELECT_MAP[key]
438
+ sql_path: str = cfg["sql_path"]
439
+ fields: list[str] = cfg.get("fields", [])
440
+
441
+ # 只挑出需要的欄位,缺少的會以 None 填充
442
+ if sel_params:
443
+ dml_params: dict = {f: sel_params.get(f) for f in fields}
444
+ else:
445
+ dml_params = {}
446
+
447
+ result = exec_dml(sql_path, dml_params)
448
+
449
+ return result
450
+
451
+ # -------------------------------------------------
452
+ # 3 通用執行函式
453
+ # -------------------------------------------------
454
+ def exec_update(key: str, raw_params: Dict[str, Any]) -> None:
455
+ """
456
+ 依照 UPDATE_MAP[key] 把 raw_params 轉成正確的 dml_params,
457
+ 再呼叫 exec_dml()。
458
+
459
+ Parameters
460
+ ----------
461
+ key : str
462
+ UPDATE_MAP 中的鍵,例如 "file_info"、"class_info" …
463
+ raw_params : dict
464
+ 呼叫端傳入的參數(可能多於或少於 fields)。
465
+ """
466
+ if key not in UPDATE_MAP:
467
+ raise KeyError(f"Update key '{key}' is not defined in UPDATE_MAP")
468
+
469
+ cfg = UPDATE_MAP[key]
470
+ sql_path: str = cfg["sql_path"]
471
+ fields: list[str] = cfg.get("fields", [])
472
+ defaults: dict = cfg.get("defaults", {})
473
+
474
+ # 只挑出需要的欄位,缺少的會以 None 填充
475
+ dml_params: dict = {f: raw_params.get(f) for f in fields}
476
+ # 合併固定值(例如 comment_file_path = "XXXX")
477
+ dml_params.update(defaults)
478
+
479
+ exec_dml(sql_path, dml_params)
480
+
481
+ # -------------------------------------------------
482
+ # 4 通用執行函式
483
+ # -------------------------------------------------
484
+ def exec_delete(key: str, raw_params: Dict[str, Any]) -> None:
485
+ """
486
+ 依照 DELETE_MAP[key] 把 raw_params 轉成正確的 dml_params,
487
+ 再呼叫 exec_dml()。
488
+
489
+ Parameters
490
+ ----------
491
+ key : str
492
+ DELETE_MAP 中的鍵,例如 "file_info"、"class_info" …
493
+ raw_params : dict
494
+ 呼叫端傳入的參數(可能多於或少於 fields)。
495
+ """
496
+ if key not in DELETE_MAP:
497
+ raise KeyError(f"Delete key '{key}' is not defined in UPDATE_MAP")
498
+
499
+ cfg = DELETE_MAP[key]
500
+ sql_path: str = cfg["sql_path"]
501
+ fields: list[str] = cfg.get("fields", [])
502
+ defaults: dict = cfg.get("defaults", {})
503
+
504
+ # 只挑出需要的欄位,缺少的會以 None 填充
505
+ dml_params: dict = {f: raw_params.get(f) for f in fields}
506
+
507
+ exec_dml(sql_path, dml_params)
508
+
@@ -0,0 +1,18 @@
1
+ import importlib.resources as pkg_resources
2
+ from pathlib import Path
3
+ from typing import Union
4
+
5
+ def load_ddl_sql(name: Union[str, Path]) -> str:
6
+ """
7
+ 读取 dml/ 目录下的 .sql 文件并返回其内容。
8
+ 参数 ``name`` 可以是文件名(不含后缀)或完整路径对象。
9
+ 示例:
10
+ sql = ddl.load_sql("insert_user_table")
11
+ """
12
+ # 兼容传入 "insert_user_table.sql" 或不带后缀的名字
13
+ filename = str(name)
14
+ if not filename.lower().endswith('.sql'):
15
+ filename += '.sql'
16
+ # pkg_resources 会在包内部查找资源文件
17
+ with pkg_resources.open_text(__package__, filename) as f:
18
+ return f.read()
@@ -0,0 +1,18 @@
1
+ import importlib.resources as pkg_resources
2
+ from pathlib import Path
3
+ from typing import Union
4
+
5
+ def load_dml_sql(name: Union[str, Path]) -> str:
6
+ """
7
+ 读取 dml/ 目录下的 .sql 文件并返回其内容。
8
+ 参数 ``name`` 可以是文件名(不含后缀)或完整路径对象。
9
+ 示例:
10
+ sql = dml.load_sql("create_user_table")
11
+ """
12
+ # 兼容传入 "create_user_table.sql" 或不带后缀的名字
13
+ filename = str(name)
14
+ if not filename.lower().endswith('.sql'):
15
+ filename += '.sql'
16
+ # pkg_resources 会在包内部查找资源文件
17
+ with pkg_resources.open_text(__package__, filename) as f:
18
+ return f.read()
@@ -0,0 +1,62 @@
1
+ # sql_executor.py
2
+ import sqlite3
3
+ from typing import Any, Mapping, Tuple, List, Union
4
+
5
+ from db.db_connect import get_connection
6
+ from db.sql_loader import load_sql
7
+
8
+
9
+ # -----------------------------------------------------------------
10
+ # 1️⃣ DDL(CREATE / ALTER / DROP …)统一执行函数
11
+ # -----------------------------------------------------------------
12
+ def exec_ddl(relative_path: str, params: Union[Mapping[str, Any], Tuple[Any, ...]] = None) -> None:
13
+ """
14
+ 执行 DDL 脚本(如建表、建索引等)。
15
+ - `relative_path` 为相对于 sql/ 目录的路径,例如 'ddl/create_user_table.sql'。
16
+ - 如果脚本里有占位符,可通过 `params` 传入 dict(命名)或 tuple(位置)。
17
+ """
18
+ sql, args = load_sql(relative_path, params)
19
+
20
+ # 只需要一次 execute,DDL 不返回结果集
21
+ with get_connection() as conn:
22
+ conn.execute(sql, args)
23
+
24
+
25
+ # -----------------------------------------------------------------
26
+ # 2️⃣ DML(SELECT / INSERT / UPDATE / DELETE)统一执行函数
27
+ # -----------------------------------------------------------------
28
+ def exec_dml(relative_path: str,
29
+ params: Union[Mapping[str, Any], Tuple[Any, ...]] = None
30
+ ) -> Union[List[Tuple[Any, ...]], int]:
31
+ """
32
+ 执行 DML 脚本。
33
+
34
+ - 对 SELECT:返回 `List[Tuple]`(查询结果)。
35
+ - 对 INSERT / UPDATE / DELETE:返回受影响的行数 (`cursor.rowcount`)。
36
+ """
37
+ sql, args = load_sql(relative_path, params)
38
+
39
+ with get_connection() as conn:
40
+ cur: sqlite3.Cursor = conn.execute(sql, args)
41
+
42
+ # 判断是否是查询语句(首个非空字符为 SELECT)
43
+ if sql.lstrip().upper().startswith("SELECT") or sql.lstrip().upper().startswith("WITH") :
44
+ result = cur.fetchall() # 读取全部结果后返回 list
45
+ else:
46
+ # 对非查询语句,事务已在 get_connection() 的 __exit__ 中提交
47
+ result = cur.rowcount # 受影响的行数
48
+
49
+ cur.close()
50
+ return result
51
+
52
+ def exec_multiple_dml(relative_path: str,
53
+ params: Union[Mapping[str, Any], Tuple[Any, ...]] = None
54
+ ):
55
+ try:
56
+ sql, args = load_sql(relative_path, params)
57
+ with get_connection() as conn:
58
+ cur = conn.cursor()
59
+ cur.executescript(sql)
60
+ # cur.close()
61
+ except sqlite3.Error as e:
62
+ raise # 需要時可重新拋出讓上層捕獲