调用DeepSeek API实现对当地数据库的AI管理

锦通  金牌会员 | 2025-2-12 17:56:15 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 877|帖子 877|积分 2631

场景形貌:基于DeepSeek模型,实现对当地数据库的AI管理。
实现思路:
1、当地python+flask搭建个WEB,设置数据源。
2、通过DeepSeek模型根据用户输入的文字需求,主动生成SQL语句。
3、通过SQL实行按钮,实现对数据库的增删改查。
前置条件:到DeepSeek官网的API开放平台注册,完成以下设置:
  1. DEEPSEEK_API_KEY=your-deepseek-api-key
  2. DEEPSEEK_API_URL=https://api.deepseek.com/v1/chat
复制代码
结果展示:

核心代码:
  1. from flask import Blueprint, render_template, request, jsonify, current_app
  2. from .database import DatabaseManager
  3. from .config import DatabaseConfig
  4. import requests
  5. from .sql_generator import SQLGenerator  # 添加这行导入
  6. main = Blueprint('main', __name__)
  7. db_manager = DatabaseManager()
  8. @main.route('/')
  9. def index():
  10.     return render_template('index.html')
  11. @main.route('/connect', methods=['POST'])
  12. def connect_database():
  13.     try:
  14.         data = request.json
  15.         print(f"收到连接请求: {data}")  # 添加调试信息
  16.         
  17.         # 先创建一个没有指定数据库的连接
  18.         config = DatabaseConfig(
  19.             host=data.get('host'),
  20.             user=data.get('user'),
  21.             password=data.get('password'),
  22.             database='',  # 先不指定数据库
  23.             port=int(data.get('port', 3306))
  24.         )
  25.         
  26.         success, error_message = db_manager.connect(config)
  27.         if success:
  28.             # 获取数据库列表
  29.             databases = db_manager.get_databases()
  30.             print(f"成功获取数据库列表: {databases}")  # 添加调试信息
  31.             return jsonify({
  32.                 'success': True,
  33.                 'databases': databases
  34.             })
  35.         print(f"连接失败: {error_message}")  # 添加调试信息
  36.         return jsonify({
  37.             'success': False,
  38.             'message': error_message
  39.         })
  40.     except Exception as e:
  41.         error_message = f"发生错误: {str(e)}"
  42.         print(error_message)  # 添加调试信息
  43.         import traceback
  44.         print(traceback.format_exc())  # 打印完整的错误堆栈
  45.         return jsonify({
  46.             'success': False,
  47.             'message': error_message
  48.         })
  49. @main.route('/select-database', methods=['POST'])
  50. def select_database():
  51.     try:
  52.         data = request.json
  53.         database = data.get('database')
  54.         if not database:
  55.             return jsonify({
  56.                 'success': False,
  57.                 'message': '请选择数据库'
  58.             })
  59.             
  60.         print(f"切换到数据库: {database}")
  61.         
  62.         # 使用选择的数据库重新连接
  63.         config = DatabaseConfig(
  64.             host=db_manager.host,
  65.             user=db_manager.user,
  66.             password=db_manager.password,
  67.             database=database,
  68.             port=db_manager.port
  69.         )
  70.         
  71.         success, error_message = db_manager.connect(config)
  72.         if success:
  73.             print(f"成功切换到数据库: {database}")
  74.             return jsonify({
  75.                 'success': True,
  76.                 'message': f'成功切换到数据库: {database}'
  77.             })
  78.         else:
  79.             print(f"切换数据库失败: {error_message}")
  80.             return jsonify({
  81.                 'success': False,
  82.                 'message': f'切换数据库失败: {error_message}'
  83.             })
  84.             
  85.     except Exception as e:
  86.         error_message = f"选择数据库时发生错误: {str(e)}"
  87.         print(error_message)
  88.         import traceback
  89.         print(traceback.format_exc())
  90.         return jsonify({
  91.             'success': False,
  92.             'message': error_message
  93.         })
  94. @main.route('/generate-sql', methods=['POST'])
  95. def generate_sql():
  96.     try:
  97.         user_input = request.json.get('input')
  98.         model_type = request.json.get('model')  # 默认值
  99.         print(f"收到SQL生成请求,用户输入: {user_input},选择模型: {model_type}")
  100.         if model_type == '':
  101.             # 使用本地 SQL 生成器
  102.             generated_sql = SQLGenerator.generate_sql(user_input)
  103.             return jsonify({
  104.                 'success': True,
  105.                 'sql': generated_sql
  106.             })
  107.         else:
  108.             # 使用其他模型的现有逻辑
  109.             model_config = current_app.config['AVAILABLE_MODELS'].get(model_type)
  110.             if not model_config:
  111.                 return jsonify({
  112.                     'success': False,
  113.                     'message': '不支持的模型类型'
  114.                 })
  115.             
  116.             # 通用提示词
  117.             prompt = f"""
  118.             作为一个SQL专家,请根据以下需求生成合适的SQL语句:
  119.             需求:{user_input}
  120.             
  121.             请只返回SQL语句,不需要其他解释。
  122.             如果是创建表,请包含合适的字段类型和必要的约束。
  123.             """
  124.             try:
  125.                 headers = {
  126.                     'Authorization': f'Bearer {model_config["api_key"]}',
  127.                     'Content-Type': 'application/json'
  128.                 }
  129.                 if model_type == 'deepseek':
  130.                     payload = {
  131.                         'model': model_config['model_name'],
  132.                         'messages': [
  133.                             {'role': 'user', 'content': prompt}
  134.                         ],
  135.                         'temperature': 0.3
  136.                     }
  137.                 else:  # OpenAI
  138.                     payload = {
  139.                         'model': model_config['model_name'],
  140.                         'messages': [
  141.                             {'role': 'system', 'content': 'You are a SQL expert. Only return SQL statements without any explanation.'},
  142.                             {'role': 'user', 'content': prompt}
  143.                         ],
  144.                         'temperature': 0.3
  145.                     }
  146.                 response = requests.post(
  147.                     model_config['api_url'],
  148.                     headers=headers,
  149.                     json=payload,
  150.                     timeout=30
  151.                 )
  152.                 if response.status_code == 200:
  153.                     if model_type == 'deepseek':
  154.                         generated_sql = response.json()['choices'][0]['message']['content'].strip()
  155.                     else:  # OpenAI
  156.                         generated_sql = response.json()['choices'][0]['message']['content'].strip()
  157.                     
  158.                     print(f"生成的SQL: {generated_sql}")
  159.                     return jsonify({'success': True, 'sql': generated_sql})
  160.                 else:
  161.                     error_message = f"API调用失败: {response.status_code} - {response.text}"
  162.                     print(error_message)
  163.                     return jsonify({
  164.                         'success': False,
  165.                         'message': error_message
  166.                     })
  167.             except requests.exceptions.RequestException as e:
  168.                 error_message = f"API请求错误: {str(e)}"
  169.                 print(error_message)
  170.                 return jsonify({
  171.                     'success': False,
  172.                     'message': error_message
  173.                 })
  174.     except Exception as e:
  175.         error_message = f"SQL生成错误: {str(e)}"
  176.         print(error_message)
  177.         import traceback
  178.         print(traceback.format_exc())
  179.         return jsonify({
  180.             'success': False,
  181.             'message': error_message
  182.         })
  183. @main.route('/execute-sql', methods=['POST'])
  184. def execute_sql():
  185.     try:
  186.         sql = request.json.get('sql')
  187.         if not sql or sql.strip().startswith('--'):
  188.             return jsonify({
  189.                 'success': False,
  190.                 'result': None,
  191.                 'message': '请先生成有效的 SQL 语句'
  192.             })
  193.         print(f"执行SQL: {sql}")
  194.         result, error_message = db_manager.execute_query(sql)
  195.         
  196.         if result is None:
  197.             return jsonify({
  198.                 'success': False,
  199.                 'result': None,
  200.                 'message': error_message or '执行失败,请确保已连接数据库并检查 SQL 语句是否正确'
  201.             })
  202.             
  203.         print(f"执行结果: {result}")
  204.         return jsonify({
  205.             'success': True,
  206.             'result': result
  207.         })
  208.         
  209.     except Exception as e:
  210.         error_message = f"SQL执行错误: {str(e)}"
  211.         print(error_message)
  212.         import traceback
  213.         print(traceback.format_exc())
  214.         return jsonify({
  215.             'success': False,
  216.             'result': None,
  217.             'message': error_message
  218.         })
  219. @main.route('/get-databases', methods=['GET'])
  220. def get_databases():
  221.     databases = db_manager.get_databases()
  222.     return jsonify({'databases': databases})
  223. @main.route('/test-connection', methods=['POST'])
  224. def test_connection():
  225.     try:
  226.         data = request.json
  227.         print(f"收到测试连接请求: {data}")
  228.         
  229.         # 创建一个没有指定数据库的连接配置
  230.         config = DatabaseConfig(
  231.             host=data.get('host'),
  232.             user=data.get('user'),
  233.             password=data.get('password'),
  234.             database='',  # 不指定数据库
  235.             port=int(data.get('port', 3306))
  236.         )
  237.         
  238.         success, error_message = db_manager.connect(config)
  239.         if success:
  240.             # 获取数据库列表
  241.             databases = db_manager.get_databases()
  242.             print(f"测试连接成功,获取到数据库列表: {databases}")
  243.             return jsonify({
  244.                 'success': True,
  245.                 'databases': databases
  246.             })
  247.         print(f"测试连接失败: {error_message}")
  248.         return jsonify({
  249.             'success': False,
  250.             'message': error_message
  251.         })
  252.     except Exception as e:
  253.         error_message = f"测试连接时发生错误: {str(e)}"
  254.         print(error_message)
  255.         import traceback
  256.         print(traceback.format_exc())
  257.         return jsonify({
  258.             'success': False,
  259.             'message': error_message
  260.         })
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表