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.
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/PKG-INFO +1 -1
- lesscode-py-0.4.4/lesscode/db/dm/dm_helper.py +322 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/version.py +1 -1
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/PKG-INFO +1 -1
- lesscode-py-0.4.3/lesscode/db/dm/dm_helper.py +0 -160
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/README.md +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/base_connection_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/base_sql_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/clickhouse/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/clickhouse/clickhouse_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/clickhouse/clickhouse_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/condition_wrapper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/connection_info.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/db_function.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/dm/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/dm/dm_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/ds_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/elasticsearch/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/elasticsearch/elasticsearch_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/elasticsearch/elasticsearch_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/es_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/es_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/es/es_request.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/generic/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/generic/generic_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/generic/generic_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/init_connection_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/base_model.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/mongodb_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mongodb/mongodb_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mysql/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mysql/mysql_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/mysql/mysql_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/nebula/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/nebula/nebula_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/nebula/nebula_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/neo4j/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/neo4j/neo4j_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/neo4j/neo4j_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/page.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/postgresql/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/postgresql/postgresql_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/postgresql/postgresql_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis/redis_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis/redis_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis_cluster/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis_cluster/redis_cluster_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/redis_cluster/redis_cluster_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/relational_db_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/sqlalchemy_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/sqlalchemy_model_service.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/db/sqlalchemy/sqlalchemy_pool.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/doc/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/doc/swagger_interface_doc_handler.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/extend_handlers/not_found_handler.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/kafka/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/kafka/kafka_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/rabbitmq/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/mq/rabbitmq/rabbitmq_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/sentry/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/sentry/sentry_monitor.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/task/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/task/job_info.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/task/task_helper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/CacheUtil.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/cache_utils.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/doc/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/doc/interface_doc.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/es_log/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/es_log/record_log.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/json.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/oss/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/oss/aliyun_oss.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/oss/ks3_oss.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/request.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/upms_util.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/utils/wrapper.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/__init__.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/base_handler.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/base_server_send_event_handler.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/base_websocket_handler.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/business_exception.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/native_handler.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/response_result.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/router_mapping.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/status_code.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode/web/web_server.py +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/SOURCES.txt +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/dependency_links.txt +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/lesscode_py.egg-info/top_level.txt +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/setup.cfg +0 -0
- {lesscode-py-0.4.3 → lesscode-py-0.4.4}/setup.py +0 -0
|
@@ -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
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|