Skip to content

Commit af24400

Browse files
committed
refactor: Add postgresql function lib
1 parent 9620817 commit af24400

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

apps/function_lib/migrations/0003_functionlib_function_type_functionlib_icon_and_more.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,55 @@ def langsearch(query, apikey):
6666
else:
6767
raise Exception(f"API请求失败: {response.status_code}, 错误信息: {response.text}")
6868
return (response.text)', '{"{\\"name\\": \\"query\\", \\"type\\": \\"string\\", \\"source\\": \\"reference\\", \\"is_required\\": true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', TRUE, 'PUBLIC', 'INTERNAL', '/src/assets/fx/langsearch/icon.png', '[{"attrs": {"type": "password", "maxlength": 200, "minlength": 1, "show-password": true, "show-word-limit": true}, "field": "apikey", "label": "apikey", "required": true, "input_type": "PasswordInput", "props_info": {"rules": [{"message": "apikey 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "apikey长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}]', '', NULL);
69+
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 07:37:54.620836 +00:00', '2025-03-17 07:37:54.620887 +00:00', 'bd1e8b88-0302-11f0-87bb-5618c4394482', 'PostgreSQL 查询', '', e'def queryPgSQL(dbname, user, password, host, port, query):
70+
import psycopg2
71+
import json
72+
from datetime import datetime
73+
74+
# 自定义 JSON 序列化函数
75+
def default_serializer(obj):
76+
if isinstance(obj, datetime):
77+
return obj.isoformat() # 将 datetime 转换为 ISO 格式字符串
78+
raise TypeError(f"Type {type(obj)} not serializable")
79+
80+
# 数据库连接信息
81+
conn_params = {
82+
"dbname": dbname,
83+
"user": user,
84+
"password": password,
85+
"host": host,
86+
"port": port
87+
}
88+
try:
89+
# 建立连接
90+
conn = psycopg2.connect(**conn_params)
91+
print("连接成功!")
92+
# 创建游标对象
93+
cursor = conn.cursor()
94+
# 执行查询语句
95+
cursor.execute(query)
96+
# 获取查询结果
97+
rows = cursor.fetchall()
98+
# 如果能查到数据代表不是第一次提问,或者用户名为“请稍等”代表是企业微信不请求接口
99+
if rows is None:
100+
return json.dumps({"status": "no", "data": []})
101+
else:
102+
columns = [desc[0] for desc in cursor.description]
103+
result = [dict(zip(columns, row)) for row in rows]
104+
# 转换为 JSON 格式
105+
json_result = json.dumps({"status": "yes", "data": result}, default=default_serializer,
106+
ensure_ascii=False)
107+
return json_result
108+
except Exception as e:
109+
print(f"发生错误:{e}")
110+
raise e
111+
finally:
112+
# 关闭游标和连接
113+
if cursor:
114+
cursor.close()
115+
if conn:
116+
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);
69118
70119
'''
71120

115 KB
Loading
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)