使用aiogram+aiosqlite无法添加用户数据至数据库表
问题分析与解决
核心问题:事务未提交+主键冲突无处理
aiosqlite 默认不会自动提交事务,你执行INSERT后未手动提交,导致数据无法写入数据库;另外如果用户已存在,INSERT会因主键冲突失败,但没有任何报错提示,这两个问题共同导致了/start命令看似无反应的现象。
具体修复步骤
1. 提交事务并避免主键冲突
修改add_user方法,添加事务提交逻辑,同时用INSERT OR IGNORE避免用户重复添加时的主键冲突:
async def add_user(self, uid: int) -> None: '''The method adds a user into the table''' await self.start() async with aiosql.connect(self.path) as con: cursor = await con.cursor() # 用INSERT OR IGNORE防止用户已存在时的报错 request = 'INSERT OR IGNORE INTO users(user_telegram_id, status) VALUES(?, ?)' await cursor.execute(request, (uid, 'member')) # 手动提交事务,确保数据写入 await con.commit()
2. 优化数据库初始化逻辑
每次调用add_user都执行start()创建表是冗余操作,建议在机器人启动时只初始化一次:
# 在机器人启动钩子中初始化数据库 async def on_bot_startup(): users_db = Users() await users_db.start() # 注册启动钩子(aiogram 3.x写法) all_router.startup.register(on_bot_startup)
3. 加异常捕获排查问题(可选)
添加异常捕获可以帮你快速定位其他潜在问题:
async def add_user(self, uid: int) -> None: '''The method adds a user into the table''' try: await self.start() async with aiosql.connect(self.path) as con: cursor = await con.cursor() request = 'INSERT OR IGNORE INTO users(user_telegram_id, status) VALUES(?, ?)' await cursor.execute(request, (uid, 'member')) await con.commit() except Exception as e: print(f"添加用户失败:{str(e)}")
额外检查点
- 确认
self.path指向的数据库文件路径正确,避免文件创建在不可写目录或错误位置 - 检查
ADMIN_ID环境变量是否正确加载,确保非管理员用户的逻辑能正常执行
内容的提问来源于stack exchange,提问作者dasEgo
相关产品推荐
相关产品推荐

