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 在上线记录下
文章来源:https://www.toymoban.com/news/detail-856819.html
6,总结
Dify 项目非常不错,代码写的也好,就是数据库是 Postgresdb 的,需要切换成Mysql。
不过还好使用的是 sqlAlchomy 切换起来也是非常的方便的。文章来源地址https://www.toymoban.com/news/detail-856819.html
到了这里,关于【Dify知识库】:可能是全网首发!将开源知识库Dify的数据库从Postgresdb切换成MySQL,解决各种兼容的问题,最终可以成功切换,做了很多期视频进行演示,持续研究中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!