Skip to content

Commit a3cd92c

Browse files
committed
refactor: Add mysql function lib
1 parent 11f63b4 commit a3cd92c

File tree

4 files changed

+73
-1
lines changed

4 files changed

+73
-1
lines changed

apps/function_lib/migrations/0003_functionlib_function_type_functionlib_icon_and_more.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,49 @@ def default_serializer(obj):
114114
cursor.close()
115115
if conn:
116116
conn.close()
117-
', '{"{\"name\": \"query\", \"type\": \"string\", \"source\": \"reference\", \"is_required\": true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', true, 'PUBLIC', 'INTERNAL', '/src/assets/fx/postgresql/icon.png', '[{"attrs": {"maxlength": 200, "minlength": 1, "show-word-limit": true}, "field": "dbname", "label": "dbname", "required": true, "input_type": "TextInput", "props_info": {"rules": [{"message": "dbname 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "dbname长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}, {"attrs": {"maxlength": 200, "minlength": 1, "show-word-limit": true}, "field": "user", "label": "user", "required": true, "input_type": "TextInput", "props_info": {"rules": [{"message": "user 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "user长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}, {"attrs": {"type": "password", "maxlength": 200, "minlength": 1, "show-password": true, "show-word-limit": true}, "field": "password", "label": "password", "required": true, "input_type": "PasswordInput", "props_info": {"rules": [{"message": "password 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "password长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}, {"attrs": {"maxlength": 200, "minlength": 1, "show-word-limit": true}, "field": "host", "label": "host", "required": true, "input_type": "TextInput", "props_info": {"rules": [{"message": "host 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "host长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}, {"attrs": {"maxlength": 20, "minlength": 1, "show-word-limit": true}, "field": "port", "label": "port", "required": true, "input_type": "TextInput", "props_info": {"rules": [{"message": "port 为必填属性", "required": true}, {"max": 20, "min": 1, "message": "port长度在 1 到 20 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}]', null, null);
117+
', '{"{\"name\": \"dbname\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"user\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"password\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"host\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"port\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"query\", \"type\": \"string\", \"source\": \"reference\", \"is_required\": true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', true, 'PUBLIC', 'INTERNAL', '/src/assets/fx/postgresql/icon.png', '[]', null, null);
118+
INSERT INTO function_lib (create_time, update_time, id, name, "desc", code, input_field_list, user_id, is_active, permission_type, function_type, icon, init_field_list, init_params, template_id) VALUES ('2025-03-17 08:16:32.626245 +00:00', '2025-03-17 08:16:32.626308 +00:00', '22c21b76-0308-11f0-9694-5618c4394482', 'MySQL 查询', '', e'
119+
def query_mysql(host,port, user, password, database, sql):
120+
import pymysql
121+
import json
122+
from pymysql.cursors import DictCursor
123+
124+
try:
125+
# 创建连接
126+
db = pymysql.connect(
127+
host=host,
128+
port=int(port),
129+
user=user,
130+
password=password,
131+
database=database,
132+
cursorclass=DictCursor # 使用字典游标
133+
)
134+
135+
# 使用 cursor() 方法创建一个游标对象 cursor
136+
cursor = db.cursor()
137+
138+
# 使用 execute() 方法执行 SQL 查询
139+
cursor.execute(sql)
140+
141+
# 使用 fetchall() 方法获取所有数据
142+
data = cursor.fetchall()
143+
144+
# 处理 bytes 类型的数据
145+
for row in data:
146+
for key, value in row.items():
147+
if isinstance(value, bytes):
148+
row[key] = value.decode(\"utf-8\") # 转换为字符串
149+
150+
# 将数据序列化为 JSON
151+
json_data = json.dumps(data, ensure_ascii=False)
152+
print(json_data)
153+
return json_data
154+
155+
# 关闭数据库连接
156+
db.close()
157+
158+
except Exception as e:
159+
print(f"Error while connecting to MySQL: {e}")', '{"{\"name\": \"host\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"port\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"user\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"password\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"database\", \"type\": \"string\", \"source\": \"custom\", \"is_required\": true}","{\"name\": \"sql\", \"type\": \"string\", \"source\": \"reference\", \"is_required\": true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', true, 'PUBLIC', 'INTERNAL', '/src/assets/fx/mysql/icon.png', '[]', null, null);
118160
119161
'''
120162

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ cffi = "^1.17.1"
6262
pysilk = "^0.0.1"
6363
django-db-connection-pool = "^1.2.5"
6464
opencv-python-headless = "^4.11.0.86"
65+
pymysql = "^1.1.1"
6566
[build-system]
6667
requires = ["poetry-core"]
6768
build-backend = "poetry.core.masonry.api"

ui/src/assets/fx/mysql/icon.png

5.73 KB
Loading

ui/src/assets/fx/mysql/index.vue

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<template>
2+
<el-drawer v-model="visible" size="40%" :append-to-body="true">
3+
<template #header>
4+
<div class="flex align-center" style="margin-left: -8px">
5+
<el-button class="cursor mr-4" link @click.prevent="visible = false">
6+
<el-icon :size="20">
7+
<Back />
8+
</el-icon>
9+
</el-button>
10+
<h4>详情</h4>
11+
</div>
12+
</template>
13+
</el-drawer>
14+
</template>
15+
16+
<script setup lang="ts">
17+
import { ref, watch } from 'vue'
18+
import { t } from '@/locales'
19+
20+
const visible = ref(false)
21+
22+
const open = (data: any) => {
23+
visible.value = true
24+
}
25+
26+
defineExpose({
27+
open
28+
})
29+
</script>

0 commit comments

Comments
 (0)