【Dify知识库】:可能是全网首发!将开源知识库Dify的数据库从Postgresdb切换成MySQL,解决各种兼容的问题,最终可以成功切换,做了很多期视频进行演示,持续研究中

2023-12-31 04:04:52

1,视频演示地址:

https://www.bilibili.com/video/BV1ni4y1Y7q2/

【Dify知识库】(4):可能是全网首发!Dify知识库魔改Postgres数据库成MySQL数据库,切换数据库连接成功!注册失败,需要继续修改代码。

2,过程是复杂的,整理好的项目地址,开源在这里

可以直接下载运行了:
https://gitee.com/fly-llm/dify-mysql-llm

3,思路因为使用的是ORM框架 sqlalchemy,修改一些uuid生成后就行

python3学习:
https://www.runoob.com/python3/python3-tutorial.html
官方网:
https://www.sqlalchemy.org/
别人总结的:
https://wiki.masantu.com/sqlalchemy-tutorial/

支持切换数据库,具体操作:

date(DATE_TRUNC('day', m.created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date, 

替换成 

date(created_at) AS date,
import uuid
数据库替换:
id = db.Column(UUID, primary_key=True, default=lambda: uuid.uuid4())

arg_dict = {'tz': account.timezone, 'app_id': app_model.id}
删除:{'tz': account.timezone, 

数据库变成:
`id` varchar(255) NOT NULL PRIMARY KEY,

增加库:mysqlclient==2.2.1

4,解决 mysql 数据库插入二进制问题

因为对数据进行序列化导致插入数据问题。

    raise sa_exc.PendingRollbackError(
sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (MySQLdb.OperationalError) (1366, "Incorrect string value: '\\x80\\x05\\x95\\x07$\\x00...' for column 'embedding' at row 1")
[SQL: INSERT INTO embeddings (id, model_name, hash, embedding) VALUES (%s, %s, %s, %s)]
[parameters: (UUID('a4a5dc14-6a5d-4ef7-a6bd-c450a6f5dfa8'), 'text_embedding', '146c895b7f57661d6189865c50991146361cbec9ef83ba010cf08ff36543ec75', b'\x80\x05\x95\x07$\x00\x00\x00\x00\x00\x00]\x94(G\xbf`V\xcbe&\x9f\xdfG?\xa42\xb8\xac\x96RHG?\x92m\xff\x85\x92\xa75G\xbf\x9b*\xda\x80\xf5\xa2gG?\xa3\x ... (24302 characters truncated) ... cZ\x18G\xbfW1i\xd5\xd5\x12\xaeG\xbf\x921\xf2\xfa\xca\x18uG\xbf{-4\x05}\x1bcG?{\xe15\x1e\x13\x9b\x92G?\x90:K\x87"H\x98G\xbf\x8a\xceS\x9d\x94\xcf\x85e.')]

解决worker 问题,修改文件:dify-mysql-docker-compose/dify-api/models/dataset.py
替换 pickle.loads 成 json.dumps

字段不使用二进制
embedding = db.Column(db.LargeBinary, nullable=False)
替换成
embedding = db.Column(db.Text, nullable=False)


    # 解决数据库插入二进制问题。直接使用 json 字符串即可。
    def set_embedding(self, embedding_data: list[float]):
        #self.embedding =  (embedding_data, protocol=pickle.HIGHEST_PROTOCOL)
        self.embedding = json.dumps(normalized_embedding)

    def get_embedding(self) -> list[float]:
        #return pickle.loads(self.embedding)
        return json.loads(self.embedding)

执行成功:

[2023-12-28 14:40:07,333: DEBUG/MainProcess] Prefix dict has been built successfully.
[2023-12-28 14:40:07,387: INFO/MainProcess] Processed dataset: b76e1340-0fb3-4c49-aeff-77ecfaba74c3 latency: 4.993560075992718
[2023-12-28 14:40:07,395: INFO/MainProcess] Task tasks.document_indexing_task.document_indexing_task[4c398a51-da4b-483f-8ca8-fa008950a352] succeeded in 5.001808531000279s: None

在这里插入图片描述

https://gitee.com/fly-llm/dify-mysql-llm/commit/d37317cff5eceaa5aa2d1e7aa8657fa228d4959e
放开一些接口限制解决报错的问题:
在这里插入图片描述
删除了 dify-mysql-docker-compose/dify-api/migrations/versions/ 下面的文件,其实都是兼容升级操作。
因为是直接创建 MySQL的版本,不牵扯到升级,兼容。

5,提交时候,遇到 gitee 在上线记录下

在这里插入图片描述

6,总结

Dify 项目非常不错,代码写的也好,就是数据库是 Postgresdb 的,需要切换成Mysql。
不过还好使用的是 sqlAlchomy 切换起来也是非常的方便的。

文章来源:https://blog.csdn.net/freewebsys/article/details/135279613
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。