我正在创建自己的聊天机器人,它可以与我的内部数据库交互,并且我想避免每次调用操作时都创建数据库连接,而是希望将 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 操作之间传递一个对象,特别是数据库连接,目的是优化资源。
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
函数中它不会为空。