如何在两个操作之间切换数据库“MySQL”的对象?

问题描述 投票:0回答:1

我正在创建自己的聊天机器人,它可以与我的内部数据库交互,并且我想避免每次调用操作时都创建数据库连接,而是希望将 MySQL 连接对象作为参数传递。 `类 ConnectToDatabase(操作):

def name(self):
    return "action_connect_to_database"

def run(self, dispatcher, tracker, domain):
    try:
        conn = mysql.connector.connect(
           "Parameters of my db"
        )
        conn_json = json.dumps(conn, default=str)
        return [SlotSet("database_connection", conn_json)]
    except Exception as e:
         dispatcher.utter_message(text=f"Error: {str(e)}")

类执行数据库查询(操作):

def name(self):
    return "action_execute_database_query"

def run(self, dispatcher, tracker, domain):
    try:
        conn = (tracker.get_slot("database_connection"))
        conn = json.loads(conn)
        print("Conn3:", str(type(conn)))
        ...`

但这给了我一个错误,特别是在 ExecuteDatabaseQuery 函数中,“conn”对象结果为空,因此“database_connection”传递到插槽的方式是错误的。 谁能告诉我为什么会这样?

我一直在尝试在 RASA 框架中的两个 python 操作之间传递一个对象,特别是数据库连接,目的是优化资源。

mysql chatbot rasa rasa-nlu
1个回答
0
投票

ExecuteDatabaseQuery
函数中“conn”对象为空的原因是因为
json.loads()
函数正在尝试加载字符串,但“database_connection”槽实际上是一个JSON对象。

要解决此问题,您需要更改序列化和反序列化数据库连接对象的方式。您可以使用

json.dumps()
json.loads()
函数,而不是使用
rasa.shared.utils.io.json_to_dict()
rasa.shared.utils.io.dict_to_json()

这是

ConnectToDatabase
操作的更新代码:

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

    def run(self, dispatcher, tracker, domain):
        try:
            conn = mysql.connector.connect(
                "Parameters of my db"
            )
            return [SlotSet("database_connection", rasa.shared.utils.io.dict_to_json(conn))]
        except Exception as e:
            dispatcher.utter_message(text=f"Error: {str(e)}")

这是 ExecuteDatabaseQuery 操作的更新代码:

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

    def run(self, dispatcher, tracker, domain):
        try:
            conn = rasa.shared.utils.io.json_to_dict(tracker.get_slot("database_connection"))
            print("Conn3:", str(type(conn)))
            ...
        except Exception as e:
            dispatcher.utter_message(text=f"Error: {str(e)}")

通过此更改,“conn”对象现在将被正确序列化和反序列化,并且在

ExecuteDatabaseQuery
函数中它不会为空。

© www.soinside.com 2019 - 2024. All rights reserved.