diff --git a/core/aiosqlite.py b/core/aiosqlite.py new file mode 100644 index 0000000..11a4f5a --- /dev/null +++ b/core/aiosqlite.py @@ -0,0 +1,58 @@ +import aiosqlite + +class AsyncSQLite: + def __init__(self, db_path: str): + self.db_path = db_path + self.conn = None + + async def init(self): + if self.conn is None: + self.conn = await aiosqlite.connect(self.db_path) + self.conn.row_factory = aiosqlite.Row + + async def close(self): + if self.conn: + await self.conn.close() + self.conn = None + + async def fetch_one(self, sql: str, params=None): + await self.init() + async with self.conn.execute(sql, params or ()) as cursor: + row = await cursor.fetchone() + return dict(row) if row else None + + async def fetch_all(self, sql: str, params=None): + await self.init() + async with self.conn.execute(sql, params or ()) as cursor: + rows = await cursor.fetchall() + return [dict(r) for r in rows] + + async def execute(self, sql: str, params=None): + await self.init() + async with self.conn.execute(sql, params or ()): + await self.conn.commit() + return True + + async def executemany(self, sql: str, params_list): + await self.init() + await self.conn.executemany(sql, params_list) + await self.conn.commit() + return True + + async def insert_record(self, table: str, data: dict): + keys = ", ".join(f"`{k}`" for k in data.keys()) + placeholders = ", ".join(['?'] * len(data)) + sql = f"INSERT INTO `{table}` ({keys}) VALUES ({placeholders})" + return await self.execute(sql, tuple(data.values())) + + async def update_record(self, table: str, data: dict, where: dict): + set_clause = ", ".join(f"`{k}`=?" for k in data.keys()) + where_clause = " AND ".join(f"`{k}`=?" for k in where.keys()) + sql = f"UPDATE `{table}` SET {set_clause} WHERE {where_clause}" + params = tuple(data.values()) + tuple(where.values()) + return await self.execute(sql, params) + + async def delete_record(self, table: str, where: dict): + where_clause = " AND ".join(f"`{k}`=?" for k in where.keys()) + sql = f"DELETE FROM `{table}` WHERE {where_clause}" + return await self.execute(sql, tuple(where.values())) diff --git a/core/async_mysql.py b/core/async_mysql.py index 75a89f1..66862ed 100644 --- a/core/async_mysql.py +++ b/core/async_mysql.py @@ -1,5 +1,6 @@ import aiomysql +from astrbot.api import logger class AsyncMySQL: def __init__(self, db_config: dict): @@ -34,6 +35,7 @@ class AsyncMySQL: await cursor.execute(sql, params or ()) return await cursor.fetchall() + async def execute(self, sql: str, params=None): """执行 SQL(insert/update/delete)""" await self.init_pool() @@ -71,6 +73,7 @@ class AsyncMySQL: keys = ", ".join(f"`{k}`" for k in data.keys()) placeholders = ", ".join(["%s"] * len(data)) sql = f"INSERT INTO `{table}` ({keys}) VALUES ({placeholders})" + logger.info(f"Executing SQL: {sql}") return await self.execute(sql, tuple(data.values())) async def update_record(self, table: str, data: dict, where: dict): diff --git a/core/jx3_service.py b/core/jx3_service.py index b45743b..aa04abe 100644 --- a/core/jx3_service.py +++ b/core/jx3_service.py @@ -4,7 +4,7 @@ from typing import Dict, Any, Optional, List, Union from astrbot.api import logger from .request import APIClient -from .AsyncMySQL import AsyncMySQL +from .async_mysql import AsyncMySQL from .function_basic import load_template,flatten_field,extract_fields,gold_to_string class JX3Service: diff --git a/core/request.py b/core/request.py index 7b43000..8526a06 100644 --- a/core/request.py +++ b/core/request.py @@ -2,8 +2,8 @@ import json import aiohttp from typing import Optional, Dict, Any, Union, List - from aiohttp import ClientTimeout, ClientSession + from astrbot.api import logger class APIClient: diff --git a/main.py b/main.py index 934328c..c8cce89 100644 --- a/main.py +++ b/main.py @@ -25,7 +25,7 @@ class Jx3ApiPlugin(Star): #获取配置 self.conf = config # 本地数据存储路径 - self.local_data_dir = StarTools.get_data_dir("astrbot_plugin_jx3api") + self.local_data_dir = StarTools.get_data_dir("astrbot_plugin_jx3") # api数据文件 self.api_file_path = Path(__file__).parent / "api_config.json" # 读取文件内容