From 6a7e88ffd6de983b815d47d0f7f8c1a4fb1ac467 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 13 Sep 2025 17:59:10 +0800 Subject: [PATCH] perf: minor fixes --- pkg/core/bootutils/deps.py | 1 + pkg/persistence/databases/postgresql.py | 23 ++++++------------- pkg/persistence/databases/sqlite.py | 3 ++- pkg/persistence/mgr.py | 5 ++-- .../dbm006_plugin_install_source.py | 18 ++++++++++++--- pyproject.toml | 3 ++- templates/config.yaml | 11 +++++++-- 7 files changed, 38 insertions(+), 26 deletions(-) diff --git a/pkg/core/bootutils/deps.py b/pkg/core/bootutils/deps.py index 1a439af8..b2508b22 100644 --- a/pkg/core/bootutils/deps.py +++ b/pkg/core/bootutils/deps.py @@ -40,6 +40,7 @@ required_deps = { 'sqlmodel': 'sqlmodel', 'telegramify_markdown': 'telegramify-markdown', 'slack_sdk': 'slack_sdk', + 'asyncpg': 'asyncpg', } diff --git a/pkg/persistence/databases/postgresql.py b/pkg/persistence/databases/postgresql.py index 19b3706b..f63d8f61 100644 --- a/pkg/persistence/databases/postgresql.py +++ b/pkg/persistence/databases/postgresql.py @@ -1,8 +1,6 @@ from __future__ import annotations -import pip import sqlalchemy.ext.asyncio as sqlalchemy_asyncio -import sys from .. import database @@ -12,19 +10,12 @@ class PostgreSQLDatabaseManager(database.BaseDatabaseManager): """PostgreSQL database manager""" async def initialize(self) -> None: + postgresql_config = self.ap.instance_config.data.get('database', {}).get('postgresql', {}) - # default to PostgreSQL with asyncpg driver - try: - __import__("asyncpg") - except ImportError: - print('以下依赖包未安装,将自动安装,请完成后重启程序:') - print( - 'The dependence package asyncpg is missing, it will be installed automatically, please restart the program after completion:' - ) - pip.main(['install', "asyncpg"]) - print('已自动安装缺失的依赖包 asyncpg ,请重启程序。') - print('The missing dependence asyncpg have been installed automatically, please restart the program.') - sys.exit(0) - - engine_url = self.ap.instance_config.data['system'].get('database', {}).get('engine_url', 'postgresql+asyncpg://root:***@127.0.0.1:5432/postgres') + host = postgresql_config.get('host', '127.0.0.1') + port = postgresql_config.get('port', 5432) + user = postgresql_config.get('user', 'postgres') + password = postgresql_config.get('password', 'postgres') + database = postgresql_config.get('database', 'postgres') + engine_url = f'postgresql+asyncpg://{user}:{password}@{host}:{port}/{database}' self.engine = sqlalchemy_asyncio.create_async_engine(engine_url) diff --git a/pkg/persistence/databases/sqlite.py b/pkg/persistence/databases/sqlite.py index 7b219e4c..ed096040 100644 --- a/pkg/persistence/databases/sqlite.py +++ b/pkg/persistence/databases/sqlite.py @@ -10,5 +10,6 @@ class SQLiteDatabaseManager(database.BaseDatabaseManager): """SQLite database manager""" async def initialize(self) -> None: - engine_url = self.ap.instance_config.data['system'].get('database', {}).get('engine_url', 'sqlite+aiosqlite:///data/langbot.db') + db_file_path = self.ap.instance_config.data.get('database', {}).get('sqlite', {}).get('path', 'data/langbot.db') + engine_url = f'sqlite+aiosqlite:///{db_file_path}' self.engine = sqlalchemy_asyncio.create_async_engine(engine_url) diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index 06ccc859..bab2cde5 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -36,9 +36,8 @@ class PersistenceManager: self.meta = base.Base.metadata async def initialize(self): - self.ap.logger.info('Initializing database...') - - database_type = self.ap.instance_config.data['system'].get('database', {}).get('type', 'sqlite') + database_type = self.ap.instance_config.data.get('database', {}).get('use', 'sqlite') + self.ap.logger.info(f'Initializing database type: {database_type}...') for manager in database.preregistered_managers: if manager.name == database_type: self.db = manager(self.ap) diff --git a/pkg/persistence/migrations/dbm006_plugin_install_source.py b/pkg/persistence/migrations/dbm006_plugin_install_source.py index 37f74929..7ab0afd3 100644 --- a/pkg/persistence/migrations/dbm006_plugin_install_source.py +++ b/pkg/persistence/migrations/dbm006_plugin_install_source.py @@ -9,9 +9,21 @@ class DBMigratePluginInstallSource(migration.DBMigration): async def upgrade(self): """升级""" # 查询表结构获取所有列名(异步执行 SQL) - result = await self.ap.persistence_mgr.execute_async(sqlalchemy.text('PRAGMA table_info(plugin_settings);')) - # fetchall() 是同步方法,无需 await - columns = [row[1] for row in result.fetchall()] + + columns = [] + + if self.ap.persistence_mgr.db.name == 'postgresql': + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.text( + "SELECT column_name FROM information_schema.columns WHERE table_name = 'plugin_settings';" + ) + ) + all_result = result.fetchall() + columns = [row[0] for row in all_result] + else: + result = await self.ap.persistence_mgr.execute_async(sqlalchemy.text('PRAGMA table_info(plugin_settings);')) + all_result = result.fetchall() + columns = [row[1] for row in all_result] # 检查并添加 install_source 列 if 'install_source' not in columns: diff --git a/pyproject.toml b/pyproject.toml index e8d8be83..a8ada81e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ "dashscope>=1.23.2", "dingtalk-stream>=0.24.0", "discord-py>=2.5.2", - "pynacl>=1.5.0", # Required for Discord voice support + "pynacl>=1.5.0", # Required for Discord voice support "gewechat-client>=0.1.5", "lark-oapi>=1.4.15", "mcp>=1.8.1", @@ -63,6 +63,7 @@ dependencies = [ "chromadb>=0.4.24", "qdrant-client (>=1.15.1,<2.0.0)", "langbot-plugin==0.1.1b6", + "asyncpg>=0.30.0", ] keywords = [ "bot", diff --git a/templates/config.yaml b/templates/config.yaml index dbb5cc46..00de2a9b 100644 --- a/templates/config.yaml +++ b/templates/config.yaml @@ -21,8 +21,15 @@ system: expire: 604800 secret: '' database: - type: sqlite - engine_url: 'sqlite+aiosqlite:///data/langbot.db' + use: sqlite + sqlite: + path: 'data/langbot.db' + postgresql: + host: '127.0.0.1' + port: 5432 + user: 'postgres' + password: 'postgres' + database: 'postgres' vdb: use: chroma qdrant: