lesscode-py 0.4.3__tar.gz → 0.4.4__tar.gz

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 (101) hide show
  1. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/PKG-INFO +1 -1
  2. lesscode-py-0.4.4/lesscode/db/dm/dm_helper.py +322 -0
  3. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/version.py +1 -1
  4. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/PKG-INFO +1 -1
  5. lesscode-py-0.4.3/lesscode/db/dm/dm_helper.py +0 -160
  6. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/README.md +0 -0
  7. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/__init__.py +0 -0
  8. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/__init__.py +0 -0
  9. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/base_connection_pool.py +0 -0
  10. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/base_sql_helper.py +0 -0
  11. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/clickhouse/__init__.py +0 -0
  12. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/clickhouse/clickhouse_helper.py +0 -0
  13. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/clickhouse/clickhouse_pool.py +0 -0
  14. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/condition_wrapper.py +0 -0
  15. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/connection_info.py +0 -0
  16. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/db_function.py +0 -0
  17. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/dm/__init__.py +0 -0
  18. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/dm/dm_pool.py +0 -0
  19. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/ds_helper.py +0 -0
  20. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/elasticsearch/__init__.py +0 -0
  21. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/elasticsearch/elasticsearch_helper.py +0 -0
  22. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/elasticsearch/elasticsearch_pool.py +0 -0
  23. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/__init__.py +0 -0
  24. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/es_helper.py +0 -0
  25. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/es_pool.py +0 -0
  26. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/es_request.py +0 -0
  27. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/generic/__init__.py +0 -0
  28. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/generic/generic_helper.py +0 -0
  29. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/generic/generic_pool.py +0 -0
  30. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/init_connection_pool.py +0 -0
  31. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/__init__.py +0 -0
  32. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/base_model.py +0 -0
  33. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/mongodb_helper.py +0 -0
  34. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/mongodb_pool.py +0 -0
  35. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mysql/__init__.py +0 -0
  36. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mysql/mysql_helper.py +0 -0
  37. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mysql/mysql_pool.py +0 -0
  38. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/nebula/__init__.py +0 -0
  39. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/nebula/nebula_helper.py +0 -0
  40. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/nebula/nebula_pool.py +0 -0
  41. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/neo4j/__init__.py +0 -0
  42. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/neo4j/neo4j_helper.py +0 -0
  43. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/neo4j/neo4j_pool.py +0 -0
  44. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/page.py +0 -0
  45. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/postgresql/__init__.py +0 -0
  46. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/postgresql/postgresql_helper.py +0 -0
  47. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/postgresql/postgresql_pool.py +0 -0
  48. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis/__init__.py +0 -0
  49. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis/redis_helper.py +0 -0
  50. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis/redis_pool.py +0 -0
  51. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis_cluster/__init__.py +0 -0
  52. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis_cluster/redis_cluster_helper.py +0 -0
  53. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis_cluster/redis_cluster_pool.py +0 -0
  54. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/relational_db_helper.py +0 -0
  55. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/__init__.py +0 -0
  56. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/sqlalchemy_helper.py +0 -0
  57. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/sqlalchemy_model_service.py +0 -0
  58. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/sqlalchemy_pool.py +0 -0
  59. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/__init__.py +0 -0
  60. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/doc/__init__.py +0 -0
  61. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/doc/swagger_interface_doc_handler.py +0 -0
  62. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/not_found_handler.py +0 -0
  63. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/__init__.py +0 -0
  64. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/kafka/__init__.py +0 -0
  65. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/kafka/kafka_helper.py +0 -0
  66. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/rabbitmq/__init__.py +0 -0
  67. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/rabbitmq/rabbitmq_helper.py +0 -0
  68. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/sentry/__init__.py +0 -0
  69. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/sentry/sentry_monitor.py +0 -0
  70. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/task/__init__.py +0 -0
  71. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/task/job_info.py +0 -0
  72. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/task/task_helper.py +0 -0
  73. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/CacheUtil.py +0 -0
  74. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/__init__.py +0 -0
  75. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/cache_utils.py +0 -0
  76. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/doc/__init__.py +0 -0
  77. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/doc/interface_doc.py +0 -0
  78. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/es_log/__init__.py +0 -0
  79. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/es_log/record_log.py +0 -0
  80. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/json.py +0 -0
  81. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/oss/__init__.py +0 -0
  82. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/oss/aliyun_oss.py +0 -0
  83. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/oss/ks3_oss.py +0 -0
  84. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/request.py +0 -0
  85. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/upms_util.py +0 -0
  86. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/wrapper.py +0 -0
  87. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/__init__.py +0 -0
  88. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/base_handler.py +0 -0
  89. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/base_server_send_event_handler.py +0 -0
  90. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/base_websocket_handler.py +0 -0
  91. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/business_exception.py +0 -0
  92. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/native_handler.py +0 -0
  93. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/response_result.py +0 -0
  94. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/router_mapping.py +0 -0
  95. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/status_code.py +0 -0
  96. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/web_server.py +0 -0
  97. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/SOURCES.txt +0 -0
  98. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/dependency_links.txt +0 -0
  99. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/top_level.txt +0 -0
  100. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/setup.cfg +0 -0
  101. {lesscode-py-0.4.3 → lesscode-py-0.4.4}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-py
3
- Version: 0.4.3
3
+ Version: 0.4.4
4
4
  Summary: lesscode-python 是基于tornado的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://gitee.com/yongchao9/lesscode-python
6
6
  Author: Chao.yy
@@ -0,0 +1,322 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from lesscode.db.base_sql_helper import BaseSqlHelper, echo_sql
4
+ from lesscode.db.condition_wrapper import ConditionWrapper
5
+ from lesscode.db.db_function import DBFunction
6
+ from lesscode.db.page import Page
7
+ from lesscode.db.relational_db_helper import RelationalDbHelper
8
+
9
+
10
+ class DmlHelper(RelationalDbHelper):
11
+
12
+ def prepare_condition_sql(self, conditions: list):
13
+ """
14
+ 拼接条件SQL 搜集参数信息
15
+ :param conditions: 条件信息
16
+ :return: 条件sql片段, values 对应参数
17
+ """
18
+ connector = "AND"
19
+ condition_sql = ""
20
+ values = []
21
+ for condition in conditions:
22
+ operator, column, value = condition
23
+ if operator == "OR" or operator == "AND":
24
+ connector = operator
25
+ continue
26
+ if operator == "BETWEEN":
27
+ sql_segment = f'"{column}" BETWEEN ? AND ?'
28
+ elif operator == "NOT_BETWEEN":
29
+ sql_segment = f'"{column}" NOT BETWEEN ? AND ?'
30
+ elif operator == "LIKE":
31
+ sql_segment = f'"{column}" LIKE ?'
32
+ value = f"%{value}%"
33
+ elif operator == "NOT_LIKE":
34
+ sql_segment = f'"{column}" NOT_LIKE ?'
35
+ value = f"%{value}%"
36
+ elif operator == "LIKE_LEFT":
37
+ sql_segment = f'"{column}" LIKE ?'
38
+ value = f"{value}%"
39
+ elif operator == "LIKE_RIGHT":
40
+ sql_segment = f'"{column}" LIKE ?'
41
+ value = f"%{value}"
42
+ elif operator == "IS_NULL":
43
+ sql_segment = f'"{column}" IS NULL '
44
+ elif operator == "IS_NOT_NULL":
45
+ sql_segment = f'"{column}" IS NOT NULL '
46
+ elif operator == "IN":
47
+ # 依据字段数组织占位符
48
+ placeholder_str = ','.join('?' for v in range(len(value)))
49
+ sql_segment = f'"{column}" IN ({placeholder_str})'
50
+ elif operator == "NOT_IN":
51
+ # 依据字段数组织占位符
52
+ placeholder_str = ','.join('?' for v in range(len(value)))
53
+ sql_segment = f'"{column}" NOT IN ({placeholder_str})'
54
+ else:
55
+ # 操作符号不需要转码的
56
+ sql_segment = f'"{column}" {operator} ?'
57
+ if condition_sql:
58
+ condition_sql = f"{condition_sql} {connector} {sql_segment}"
59
+ else:
60
+ condition_sql = sql_segment
61
+ if column is not None:
62
+ if isinstance(value, list):
63
+ values.extend(value)
64
+ else:
65
+ values.append(value)
66
+ return condition_sql, values
67
+
68
+ def prepare_query_sql(self, condition_wrapper: ConditionWrapper):
69
+ """
70
+ 获取完整拼接查询SQL
71
+ :param condition_wrapper: 查询条件对象
72
+ :return:sql 查询sql, values 对应参数
73
+ """
74
+ column_str = ''
75
+ if condition_wrapper.column:
76
+ flag = False
77
+ if "*" in condition_wrapper.column:
78
+ condition_wrapper.column.remove("*")
79
+ flag = True
80
+ else:
81
+ column_str = ','.join([f'"{_}"' for _ in condition_wrapper.column])
82
+ if flag:
83
+ if column_str:
84
+ column_str += ",*"
85
+ else:
86
+ column_str = "*"
87
+ sql = f'SELECT {column_str} FROM "{condition_wrapper.table}" '
88
+ condition_sql, values = self.prepare_condition_sql(condition_wrapper.conditions)
89
+ # 拼接 条件SQL
90
+ if condition_sql:
91
+ sql += f" WHERE {condition_sql}"
92
+ # 拼接 分组SQL
93
+ if condition_wrapper.group:
94
+ group_sql = ""
95
+ if isinstance(condition_wrapper.group, str):
96
+ group_sql = f" GROUP BY {condition_wrapper.group}"
97
+ elif isinstance(condition_wrapper.group, list):
98
+ group_sql = f" GROUP BY {','.join(condition_wrapper.group)}"
99
+ sql += group_sql
100
+ # 拼接 排序SQL
101
+ if condition_wrapper.order:
102
+ sql += f" ORDER BY {','.join([' '.join(item) for item in condition_wrapper.order])}"
103
+ return sql, values
104
+
105
+ def prepare_insert_sql(self, table_name: str, item: dict):
106
+ """
107
+ 组装插入sql
108
+ :param table_name:
109
+ :param item:
110
+ :return:
111
+ """
112
+ # 组装插入数据字段
113
+ column_str = ','.join(item.keys())
114
+ # 依据字段数组织占位符
115
+ placeholder_items = []
116
+ for v in item.values():
117
+ if isinstance(v, DBFunction):
118
+ placeholder_items.append(v.function_body)
119
+ else:
120
+ placeholder_items.append("?")
121
+ placeholder_str = ','.join(placeholder_items)
122
+ # 组装可执行SQL
123
+ insert_sql = f'INSERT INTO "{table_name}" ({column_str}) VALUES ({placeholder_str})'
124
+ return insert_sql
125
+
126
+ def prepare_update_sql(self, condition_wrapper: ConditionWrapper, param: dict):
127
+ """
128
+ 组装更新sql
129
+ :param condition_wrapper:
130
+ :param param:
131
+ :return:
132
+ """
133
+ value_items = []
134
+ placeholder_items = []
135
+ for key in param.keys():
136
+ v = param.get(key)
137
+ if isinstance(v, DBFunction):
138
+ placeholder_items.append(f"{key}={v.function_body}")
139
+ value_items.append(v.value)
140
+ else:
141
+ placeholder_items.append(f"{key}=?")
142
+ value_items.append(v)
143
+ column_sql = ','.join(placeholder_items)
144
+ condition_sql, values = self.prepare_condition_sql(condition_wrapper.conditions)
145
+ update_sql = f'UPDATE "{condition_wrapper.table}" SET {column_sql} WHERE {condition_sql}'
146
+ return update_sql, value_items + values
147
+
148
+ def prepare_delete_sql(self, condition_wrapper: ConditionWrapper):
149
+ """
150
+ 组装删除SQl
151
+ :param condition_wrapper:
152
+ :return:
153
+ """
154
+ condition_sql, values = self.prepare_condition_sql(condition_wrapper.conditions)
155
+ delete_sql = f'DELETE FROM "{condition_wrapper.table}" WHERE {condition_sql}'
156
+ return delete_sql, values
157
+
158
+ """
159
+ Mysql数据库操作实现
160
+ """
161
+
162
+ @echo_sql
163
+ async def execute_sql(self, sql: str, param=None):
164
+ """
165
+ 执行sql 仅返回影响数量
166
+ :param sql:
167
+ :param param:
168
+ :return:
169
+ """
170
+ async with self.pool.acquire() as conn:
171
+ async with conn.cursor() as cursor:
172
+ await cursor.execute(sql, param)
173
+ return {"rowcount": cursor.rowcount}
174
+
175
+ @echo_sql
176
+ async def executemany_sql(self, sql: str, param=None):
177
+ """
178
+ 执行批量sql 仅返回影响数量
179
+ :param sql:
180
+ :param param:
181
+ :return:
182
+ """
183
+ async with self.pool.acquire() as conn:
184
+ async with conn.cursor() as cursor:
185
+ # 执行sql 传入参数
186
+ await cursor.executemany(sql, [tuple(item.values()) for item in param])
187
+ return {"rowcount": cursor.rowcount}
188
+
189
+ @echo_sql
190
+ async def execute_fetchone(self, sql: str, param=None):
191
+ """
192
+ 查询单条数据
193
+ :param sql: 待执行的Sql语句
194
+ :param param: 参数
195
+ :return:
196
+ """
197
+ async with self.pool.acquire() as conn:
198
+ async with conn.cursor() as cursor:
199
+ if param:
200
+ await cursor.execute(sql, param)
201
+ else:
202
+ await cursor.execute(sql)
203
+ description = cursor.description
204
+ rs = await cursor.fetchone()
205
+ return BaseSqlHelper.dict_row(description, rs)
206
+
207
+ @echo_sql
208
+ async def execute_fetchall(self, sql: str, param=None):
209
+ """
210
+ 查询多条数据
211
+ :param sql: 待执行的Sql语句
212
+ :param param: 参数
213
+ :return:
214
+ """
215
+ async with self.pool.acquire() as conn:
216
+ async with conn.cursor() as cursor:
217
+ if param:
218
+ await cursor.execute(sql, param)
219
+ else:
220
+ await cursor.execute(sql)
221
+ description = cursor.description
222
+ rs = await cursor.fetchall()
223
+ return BaseSqlHelper.dict_row(description, list(rs))
224
+
225
+ @echo_sql
226
+ def sync_execute_sql(self, sql: str, param=None):
227
+ """
228
+ 执行sql 仅返回影响数量
229
+ :param sql:
230
+ :param param:
231
+ :return:
232
+ """
233
+ with self.pool.dedicated_connection() as conn:
234
+ conn.ping()
235
+ with conn.cursor() as cursor:
236
+ cursor.execute(sql, param)
237
+ return {"rowcount": cursor.rowcount}
238
+
239
+ @echo_sql
240
+ def sync_executemany_sql(self, sql: str, param=None):
241
+ """
242
+ 执行批量sql 仅返回影响数量
243
+ :param sql:
244
+ :param param:
245
+ :return:
246
+ """
247
+ with self.pool.dedicated_connection() as conn:
248
+ conn.ping()
249
+ with conn.cursor() as cursor:
250
+ cursor.executemany(sql, [tuple(item.values()) for item in param])
251
+ return {"rowcount": cursor.rowcount}
252
+
253
+ @echo_sql
254
+ def sync_execute_fetchone(self, sql: str, param=None):
255
+ """
256
+ 查询单条数据
257
+ :param sql: 待执行的Sql语句
258
+ :param param: 参数
259
+ :return:
260
+ """
261
+ with self.pool.dedicated_connection() as conn:
262
+ conn.ping()
263
+ with conn.cursor() as cursor:
264
+ if param:
265
+ cursor.execute(sql, param)
266
+ else:
267
+ cursor.execute(sql)
268
+ description = cursor.description
269
+ rs = cursor.fetchone()
270
+ return BaseSqlHelper.dict_row(description, rs)
271
+
272
+ @echo_sql
273
+ def sync_execute_fetchall(self, sql: str, param=None):
274
+ """
275
+ 查询多条数据
276
+ :param sql: 待执行的Sql语句
277
+ :param param: 参数
278
+ :return:
279
+ """
280
+ with self.pool.dedicated_connection() as conn:
281
+ conn.ping()
282
+ with conn.cursor() as cursor:
283
+ if param:
284
+ cursor.execute(sql, param)
285
+ else:
286
+ cursor.execute(sql)
287
+ description = cursor.description
288
+ rs = cursor.fetchall()
289
+ return BaseSqlHelper.dict_row(description, list(rs))
290
+
291
+ def prepare_page_sql(self, condition_wrapper: ConditionWrapper, page_num: int, page_size: int):
292
+ """
293
+ 获取分页SQL
294
+ :param condition_wrapper: 查询参数
295
+ :param page_num: 当前页
296
+ :param page_size: 每页记录数
297
+ :return:page_sql 分页sql, values 对应参数, count_sql 统计总数sql
298
+ """
299
+ query_sql, values = self.prepare_query_sql(condition_wrapper)
300
+ cols = []
301
+ for col in condition_wrapper.column:
302
+ col = col.upper().replace("AS", "").strip().split(" ")
303
+ cols.append(col[-1].strip())
304
+ column_str = ''
305
+ if cols:
306
+ flag = False
307
+ if "*" in cols:
308
+ cols.remove("*")
309
+ flag = True
310
+ else:
311
+ column_str = ','.join([f'"{_}"' for _ in cols])
312
+ if flag:
313
+ if column_str:
314
+ column_str += ",*"
315
+ else:
316
+ column_str = "*"
317
+
318
+ # 组装分页查询语句,需要依据页码计算 起始索引
319
+ page_sql = f"SELECT {column_str} FROM ({query_sql}) cs LIMIT {Page.skip(page_num, page_size)},{page_size}"
320
+ # 组装查询数量语句
321
+ count_sql = f"SELECT count(1) total FROM ({query_sql}) cs"
322
+ return page_sql, values, count_sql
@@ -5,4 +5,4 @@
5
5
  lesscode python version file.
6
6
  """
7
7
 
8
- __version__ = "0.4.3"
8
+ __version__ = "0.4.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-py
3
- Version: 0.4.3
3
+ Version: 0.4.4
4
4
  Summary: lesscode-python 是基于tornado的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://gitee.com/yongchao9/lesscode-python
6
6
  Author: Chao.yy
@@ -1,160 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- from lesscode.db.base_sql_helper import BaseSqlHelper, echo_sql
4
- from lesscode.db.condition_wrapper import ConditionWrapper
5
- from lesscode.db.page import Page
6
- from lesscode.db.relational_db_helper import RelationalDbHelper
7
-
8
-
9
- class DmlHelper(RelationalDbHelper):
10
- """
11
- Mysql数据库操作实现
12
- """
13
-
14
- @echo_sql
15
- async def execute_sql(self, sql: str, param=None):
16
- """
17
- 执行sql 仅返回影响数量
18
- :param sql:
19
- :param param:
20
- :return:
21
- """
22
- async with self.pool.acquire() as conn:
23
- async with conn.cursor() as cursor:
24
- await cursor.execute(sql, param)
25
- return {"rowcount": cursor.rowcount}
26
-
27
- @echo_sql
28
- async def executemany_sql(self, sql: str, param=None):
29
- """
30
- 执行批量sql 仅返回影响数量
31
- :param sql:
32
- :param param:
33
- :return:
34
- """
35
- async with self.pool.acquire() as conn:
36
- async with conn.cursor() as cursor:
37
- # 执行sql 传入参数
38
- await cursor.executemany(sql, [tuple(item.values()) for item in param])
39
- return {"rowcount": cursor.rowcount}
40
-
41
- @echo_sql
42
- async def execute_fetchone(self, sql: str, param=None):
43
- """
44
- 查询单条数据
45
- :param sql: 待执行的Sql语句
46
- :param param: 参数
47
- :return:
48
- """
49
- async with self.pool.acquire() as conn:
50
- async with conn.cursor() as cursor:
51
- if param:
52
- await cursor.execute(sql, param)
53
- else:
54
- await cursor.execute(sql)
55
- description = cursor.description
56
- rs = await cursor.fetchone()
57
- return BaseSqlHelper.dict_row(description, rs)
58
-
59
- @echo_sql
60
- async def execute_fetchall(self, sql: str, param=None):
61
- """
62
- 查询多条数据
63
- :param sql: 待执行的Sql语句
64
- :param param: 参数
65
- :return:
66
- """
67
- async with self.pool.acquire() as conn:
68
- async with conn.cursor() as cursor:
69
- if param:
70
- await cursor.execute(sql, param)
71
- else:
72
- await cursor.execute(sql)
73
- description = cursor.description
74
- rs = await cursor.fetchall()
75
- return BaseSqlHelper.dict_row(description, list(rs))
76
-
77
- @echo_sql
78
- def sync_execute_sql(self, sql: str, param=None):
79
- """
80
- 执行sql 仅返回影响数量
81
- :param sql:
82
- :param param:
83
- :return:
84
- """
85
- with self.pool.dedicated_connection() as conn:
86
- conn.ping()
87
- with conn.cursor() as cursor:
88
- cursor.execute(sql, param)
89
- return {"rowcount": cursor.rowcount}
90
-
91
- @echo_sql
92
- def sync_executemany_sql(self, sql: str, param=None):
93
- """
94
- 执行批量sql 仅返回影响数量
95
- :param sql:
96
- :param param:
97
- :return:
98
- """
99
- with self.pool.dedicated_connection() as conn:
100
- conn.ping()
101
- with conn.cursor() as cursor:
102
- cursor.executemany(sql, [tuple(item.values()) for item in param])
103
- return {"rowcount": cursor.rowcount}
104
-
105
- @echo_sql
106
- def sync_execute_fetchone(self, sql: str, param=None):
107
- """
108
- 查询单条数据
109
- :param sql: 待执行的Sql语句
110
- :param param: 参数
111
- :return:
112
- """
113
- with self.pool.dedicated_connection() as conn:
114
- conn.ping()
115
- with conn.cursor() as cursor:
116
- if param:
117
- cursor.execute(sql, param)
118
- else:
119
- cursor.execute(sql)
120
- description = cursor.description
121
- rs = cursor.fetchone()
122
- return BaseSqlHelper.dict_row(description, rs)
123
-
124
- @echo_sql
125
- def sync_execute_fetchall(self, sql: str, param=None):
126
- """
127
- 查询多条数据
128
- :param sql: 待执行的Sql语句
129
- :param param: 参数
130
- :return:
131
- """
132
- with self.pool.dedicated_connection() as conn:
133
- conn.ping()
134
- with conn.cursor() as cursor:
135
- if param:
136
- cursor.execute(sql, param)
137
- else:
138
- cursor.execute(sql)
139
- description = cursor.description
140
- rs = cursor.fetchall()
141
- return BaseSqlHelper.dict_row(description, list(rs))
142
-
143
- def prepare_page_sql(self, condition_wrapper: ConditionWrapper, page_num: int, page_size: int):
144
- """
145
- 获取分页SQL
146
- :param condition_wrapper: 查询参数
147
- :param page_num: 当前页
148
- :param page_size: 每页记录数
149
- :return:page_sql 分页sql, values 对应参数, count_sql 统计总数sql
150
- """
151
- query_sql, values = self.prepare_query_sql(condition_wrapper)
152
- cols = []
153
- for col in condition_wrapper.column:
154
- col = col.upper().replace("AS", "").strip().split(" ")
155
- cols.append(col[-1].strip())
156
- # 组装分页查询语句,需要依据页码计算 起始索引
157
- page_sql = f"SELECT {','.join(cols)} FROM ({query_sql}) cs LIMIT {Page.skip(page_num, page_size)},{page_size}"
158
- # 组装查询数量语句
159
- count_sql = f"SELECT count(1) total FROM ({query_sql}) cs"
160
- return page_sql, values, count_sql
File without changes
File without changes
File without changes