You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rasa框架中传递MySQL连接对象至Slot报错问题排查

问题原因及解决方案

核心原因

  1. MySQL连接对象无法被JSON序列化:你用json.dumps(conn, default=str)只是把连接对象转成了它的字符串标识(类似<mysql.connector.connection_cext.CMySQLConnection object at 0x...>),并非真正序列化对象本身。后续json.loads解析回来的只是这个字符串,不是可用的数据库连接实例,自然无法执行查询操作。
  2. Rasa Slot不适合存储活跃资源:Rasa的Slot设计用于存储可序列化的简单数据(如字符串、数字、基础字典),活跃的数据库连接包含套接字、会话状态等不可持久化的资源,即使强行存入Slot,也会因序列化丢失核心状态,而且连接会在闲置时超时失效。

正确实现方式

方式1:单例模式管理全局连接

创建独立模块管理数据库连接,保证整个应用中仅存在一个连接实例,所有Action直接调用该实例:

# db_connection.py
import mysql.connector

class DBConnection:
    _instance = None

    @classmethod
    def get_instance(cls):
        # 检查连接是否存在或活跃,断开则重新创建
        if cls._instance is None or not cls._instance.is_connected():
            cls._instance = mysql.connector.connect(
                host="你的数据库地址",
                user="用户名",
                password="密码",
                database="目标库名"
            )
        return cls._instance

在Action中调用:

from db_connection import DBConnection

class ConnectToDatabase(Action):
    def name(self):
        return "action_connect_to_database"

    def run(self, dispatcher, tracker, domain):
        try:
            # 初始化/获取连接实例
            DBConnection.get_instance()
            dispatcher.utter_message(text="数据库连接成功")
            return []
        except Exception as e:
             dispatcher.utter_message(text=f"连接错误: {str(e)}")

class ExecuteDatabaseQuery(Action):
    def name(self):
        return "action_execute_database_query"

    def run(self, dispatcher, tracker, domain):
        try:
            conn = DBConnection.get_instance()
            cursor = conn.cursor()
            cursor.execute("SELECT * FROM 你的表名")
            results = cursor.fetchall()
            dispatcher.utter_message(text=f"查询结果: {results}")
            cursor.close()
            return []
        except Exception as e:
             dispatcher.utter_message(text=f"查询错误: {str(e)}")

方式2:自定义组件初始化连接

可在Rasa自定义组件中创建连接,并存入tracker.metadata,但需注意:metadata仍会被序列化,因此更建议用单例模式;若仅存储连接参数,每次使用时重新连接,会失去复用连接的优化目的。

注意事项

  • 数据库连接会超时,每次使用前需检查连接状态,断开则重新创建。
  • Slot仅用于存储用户会话相关的简单数据,禁止存储任何带状态的资源。

内容的提问来源于stack exchange,提问作者Alessandro Pio Budetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:30:15