feat: 准备迁移general service
This commit is contained in:
@@ -0,0 +1,362 @@
|
||||
from app.general.general_utils.build_delete_sql import build_delete_sql
|
||||
from app.general.general_utils.build_insert_sql import build_insert_sql
|
||||
from app.general.general_utils.build_query_sql import build_query_sql
|
||||
from app.general.general_utils.build_update_sql import build_update_sql
|
||||
from app.general.general_utils.sql_utils import get_value, create_convertor
|
||||
|
||||
|
||||
def get_default_orders(query_config, module_config):
|
||||
orders = get_value(query_config, 'orders', None)
|
||||
if orders is not None:
|
||||
return orders
|
||||
module_config_default_orders = get_value(
|
||||
get_value(module_config, 'default', {}),
|
||||
'orders',
|
||||
None
|
||||
)
|
||||
if module_config_default_orders is not None:
|
||||
return module_config_default_orders
|
||||
return {"field": "createdAt", "desc": True}
|
||||
|
||||
|
||||
def get_id(cursor, len):
|
||||
if len is None:
|
||||
len = 1
|
||||
sql = f"select {','.join([f'uuid() as _{idx}' for idx in range(len)])}"
|
||||
cursor.execute(sql)
|
||||
rows = cursor.fetchall()
|
||||
|
||||
columns = [column[0] for column in cursor.description]
|
||||
result = [dict(zip(columns, row)) for row in rows]
|
||||
|
||||
return [val for key, val in result[0].items()]
|
||||
|
||||
|
||||
def list(connect_config, query_config, module_config, debug_data=[]):
|
||||
conn, cursor, close = get_sql_connection(connect_config)
|
||||
|
||||
n_page = get_value(query_config, 'page', 0)
|
||||
n_size = get_value(query_config, 'size', 5)
|
||||
n_only_count = get_value(query_config, 'onlyCount', False)
|
||||
|
||||
offset = n_page * n_size
|
||||
# 多查一条数据,方便判断是否有下一页数据
|
||||
size = n_size + 1
|
||||
|
||||
target_query_config = {
|
||||
**query_config,
|
||||
"offset": offset,
|
||||
"size": size,
|
||||
"orders": get_default_orders(query_config, module_config)
|
||||
}
|
||||
|
||||
sql, values = build_query_sql(target_query_config, module_config)
|
||||
|
||||
try:
|
||||
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
rows = cursor.fetchall()
|
||||
|
||||
# 将查询结果转换为字典列表
|
||||
columns = [column[0] for column in cursor.description]
|
||||
result = [dict(zip(columns, row)) for row in rows]
|
||||
|
||||
create_convertor(module_config)['decode_list'](result)
|
||||
|
||||
if n_only_count:
|
||||
return {
|
||||
"total": result[0]['total']
|
||||
}
|
||||
else:
|
||||
has_next = False if get_value(query_config, 'all', False) else len(result) == n_size + 1
|
||||
if has_next:
|
||||
result.pop()
|
||||
return {
|
||||
"hasNext": has_next,
|
||||
"list": result,
|
||||
}
|
||||
except mysql.connector.Error as err:
|
||||
return {
|
||||
"error": f"Error: {err}",
|
||||
}
|
||||
finally:
|
||||
close()
|
||||
|
||||
|
||||
def item(connect_config, query_config, module_config, debug_data=[]):
|
||||
target_query_config = {
|
||||
"offset": 0,
|
||||
"size": 1,
|
||||
"filters": [],
|
||||
"orders": {"field": "createdAt", "desc": True},
|
||||
}
|
||||
for humpName, value in query_config.items():
|
||||
target_query_config['filters'].append({
|
||||
"field": humpName,
|
||||
"value": value,
|
||||
"operator": "="
|
||||
})
|
||||
|
||||
result = list(connect_config=connect_config, query_config=target_query_config, module_config=module_config, debug_data=debug_data)
|
||||
|
||||
if "error" in result:
|
||||
return result
|
||||
|
||||
return {"result": None if "list" not in result or len(result['list']) == 0 else result['list'][0]}
|
||||
|
||||
|
||||
def insert(connect_config, query_config, module_config, debug_data=[]):
|
||||
conn, cursor, close = get_sql_connection(connect_config)
|
||||
|
||||
row = get_value(query_config, 'row', None)
|
||||
if row is None:
|
||||
return {
|
||||
"error": "row parameter is missing",
|
||||
}
|
||||
create_convertor(module_config)['encode_list']([row])
|
||||
|
||||
row_id = get_value(row, 'id', None)
|
||||
|
||||
if row_id is None:
|
||||
row_id = get_id(cursor, 1)[0]
|
||||
row['id'] = row_id
|
||||
|
||||
try:
|
||||
sql, values = build_insert_sql(module_config, row)
|
||||
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
conn.commit()
|
||||
|
||||
sql, values = build_query_sql({"page": 0, "size": 1, "filters": [{"field": "id", "operator": "=", "value": row_id}]}, module_config)
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
rows = cursor.fetchall()
|
||||
|
||||
columns = [column[0] for column in cursor.description]
|
||||
result = [dict(zip(columns, row)) for row in rows]
|
||||
|
||||
create_convertor(module_config)['decode_list'](result)
|
||||
|
||||
if len(result) > 0:
|
||||
return {
|
||||
"result": result[0]
|
||||
}
|
||||
else:
|
||||
return {
|
||||
"error": "insert failed, query result is empty",
|
||||
}
|
||||
|
||||
except mysql.connector.Error as err:
|
||||
return {
|
||||
"error": f"Error: {err}",
|
||||
}
|
||||
finally:
|
||||
close()
|
||||
|
||||
|
||||
def batch_insert(connect_config, query_config, module_config, debug_data=[]):
|
||||
conn, cursor, close = get_sql_connection(connect_config)
|
||||
|
||||
rows = get_value(query_config, 'rows', None)
|
||||
if rows is None or len(rows) == 0:
|
||||
return {
|
||||
"error": "rows parameter is missing",
|
||||
}
|
||||
create_convertor(module_config)['encode_list'](rows)
|
||||
|
||||
row_id_list = []
|
||||
for row in rows:
|
||||
row_id = get_value(row, 'id', None)
|
||||
if row_id is None:
|
||||
row_id = get_id(cursor, 1)[0]
|
||||
row['id'] = row_id
|
||||
row_id_list.append(row_id)
|
||||
|
||||
try:
|
||||
for row in rows:
|
||||
sql, values = build_insert_sql(module_config, row)
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
|
||||
conn.commit()
|
||||
|
||||
sql, values = build_query_sql({"all": True, "filters": [{"field": "id", "operator": "in", "value": row_id_list}]}, module_config)
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
rows = cursor.fetchall()
|
||||
|
||||
columns = [column[0] for column in cursor.description]
|
||||
result = [dict(zip(columns, row)) for row in rows]
|
||||
|
||||
create_convertor(module_config)['decode_list'](result)
|
||||
|
||||
if len(result) > 0:
|
||||
return {
|
||||
"result": result
|
||||
}
|
||||
else:
|
||||
return {
|
||||
"error": "insert failed, query result is empty",
|
||||
}
|
||||
|
||||
except mysql.connector.Error as err:
|
||||
return {
|
||||
"error": f"Error: {err}",
|
||||
}
|
||||
finally:
|
||||
close()
|
||||
|
||||
|
||||
def update(connect_config, query_config, module_config, debug_data=[]):
|
||||
conn, cursor, close = get_sql_connection(connect_config)
|
||||
|
||||
row = get_value(query_config, 'row', None)
|
||||
update_fields = get_value(query_config, 'updateFields', None)
|
||||
|
||||
if row is None:
|
||||
return {
|
||||
"error": "row parameter is missing",
|
||||
}
|
||||
|
||||
row_id = get_value(row, 'id', None)
|
||||
|
||||
if row_id is None:
|
||||
return {
|
||||
"error": "row is missing field: id",
|
||||
}
|
||||
|
||||
create_convertor(module_config)['encode_list']([row])
|
||||
|
||||
try:
|
||||
sql, values = build_update_sql(module_config, row, update_fields)
|
||||
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
conn.commit()
|
||||
|
||||
sql, values = build_query_sql({"page": 0, "size": 1, "filters": [{"field": "id", "operator": "=", "value": row_id}]}, module_config)
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
rows = cursor.fetchall()
|
||||
|
||||
columns = [column[0] for column in cursor.description]
|
||||
result = [dict(zip(columns, row)) for row in rows]
|
||||
|
||||
create_convertor(module_config)['decode_list'](result)
|
||||
|
||||
if len(result) > 0:
|
||||
return {
|
||||
"result": result[0]
|
||||
}
|
||||
else:
|
||||
return {
|
||||
"error": "update failed, query result is empty",
|
||||
}
|
||||
|
||||
except mysql.connector.Error as err:
|
||||
return {
|
||||
"error": f"Error: {err}",
|
||||
}
|
||||
finally:
|
||||
close()
|
||||
|
||||
|
||||
def batch_update(connect_config, query_config, module_config, debug_data=[]):
|
||||
conn, cursor, close = get_sql_connection(connect_config)
|
||||
|
||||
rows = get_value(query_config, 'rows', None)
|
||||
update_fields = get_value(query_config, 'updateFields', None)
|
||||
|
||||
if rows is None or len(rows) == 0:
|
||||
return {
|
||||
"error": "rows parameter is missing",
|
||||
}
|
||||
create_convertor(module_config)['encode_list'](rows)
|
||||
|
||||
row_id_list = []
|
||||
for row in rows:
|
||||
row_id = get_value(row, 'id', None)
|
||||
if row_id is None:
|
||||
return {
|
||||
"error": "row is missing field: id",
|
||||
"row": row,
|
||||
}
|
||||
row_id_list.append(row_id)
|
||||
|
||||
try:
|
||||
for row in rows:
|
||||
sql, values = build_update_sql(module_config, row, update_fields)
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
|
||||
conn.commit()
|
||||
|
||||
sql, values = build_query_sql({"all": True, "filters": [{"field": "id", "operator": "in", "value": row_id_list}]}, module_config)
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
rows = cursor.fetchall()
|
||||
|
||||
columns = [column[0] for column in cursor.description]
|
||||
result = [dict(zip(columns, row)) for row in rows]
|
||||
|
||||
create_convertor(module_config)['decode_list'](result)
|
||||
|
||||
if len(result) > 0:
|
||||
return {
|
||||
"result": result
|
||||
}
|
||||
else:
|
||||
return {
|
||||
"error": "update failed, query result is empty",
|
||||
}
|
||||
|
||||
except mysql.connector.Error as err:
|
||||
return {
|
||||
"error": f"Error: {err}",
|
||||
}
|
||||
finally:
|
||||
close()
|
||||
|
||||
|
||||
def delete(connect_config, query_config, module_config, debug_data=[]):
|
||||
conn, cursor, close = get_sql_connection(connect_config)
|
||||
id = get_value(query_config, 'id', None)
|
||||
if id is None:
|
||||
return {
|
||||
"error": "id parameter is missing",
|
||||
}
|
||||
|
||||
try:
|
||||
sql, values = build_delete_sql(module_config, id)
|
||||
debug_data.append({"sql": sql, "values": values})
|
||||
cursor.execute(sql, values)
|
||||
conn.commit()
|
||||
|
||||
deleted_rows = cursor.rowcount
|
||||
|
||||
if deleted_rows >= 1:
|
||||
return {"deletedRows": deleted_rows}
|
||||
else:
|
||||
return {"error": f"delete failed, delete rows is {deleted_rows}", }
|
||||
except mysql.connector.Error as err:
|
||||
return {
|
||||
"error": f"Error: {err}",
|
||||
}
|
||||
finally:
|
||||
close()
|
||||
|
||||
|
||||
class SqlService():
|
||||
def __init__(self):
|
||||
self.list = list
|
||||
self.item = item
|
||||
self.insert = insert
|
||||
self.update = update
|
||||
self.delete = delete
|
||||
self.batch_insert = batch_insert
|
||||
self.batch_update = batch_update
|
||||
|
||||
|
||||
sql_service = SqlService()
|
||||
Reference in New Issue
Block a user