aiogram开发Telegram机器人时用户提交的个人信息未更新到数据库问题
问题修复方案
你的代码共有4处核心错误导致数据无法更新,以下是具体问题和修正方案:
1. SQL语法错误:字段名误用单引号
sqlite中单引号代表字符串常量,你在所有SQL语句中用单引号包裹字段名/表名,导致条件判断变成了字符串比较,永远匹配不到记录。正确的做法是不用引号,或者用反引号`包裹标识符。
错误示例:
SELECT * FROM 'clients' WHERE 'user_id' = ?
修正后:
SELECT * FROM clients WHERE user_id = ?
2. 更新语句参数顺序颠倒
set_client_phone和set_client_email两个方法的传参顺序和SQL语句的占位符顺序不匹配:
原错误代码:
def set_client_phone(self, user_id, cl_phone): with self.connection: return self.cursor.execute("UPDATE 'clients' SET 'Phone' = ? WHERE 'user_id' = ?", (user_id, cl_phone,))
这里你把user_id传给了Phone字段的占位符,把cl_phone传给了WHERE条件的占位符,永远找不到对应记录,自然更新失败。
修正后:
def set_client_phone(self, user_id, cl_phone): with self.connection: return self.cursor.execute("UPDATE clients SET Phone = ? WHERE user_id = ?", (cl_phone, user_id))
同理set_client_email也需要调换参数顺序:
def set_client_email(self, user_id, cl_email): with self.connection: return self.cursor.execute("UPDATE clients SET Email = ? WHERE user_id = ?", (cl_email, user_id))
3. 姓名校验逻辑位置错误
你把姓名的长度、非法字符校验放在了reg_start函数中,此时用户输入的内容是next,校验逻辑完全没有作用,应该把这段校验移到set_cl_name处理器中。
4. 取消功能语法错误
cansel_handler中获取当前状态的代码写错了乘号,修正为:
current_state = await state.get_state()
其他优化建议
- 手机号校验不要直接用
int(message.text),如果用户输入非数字会直接抛异常,改为用str.isdigit()判断,或者加try-except捕获异常 - 所有数据库操作执行后可以加
self.connection.commit()确保变更持久化,部分sqlite版本上下文管理器不会自动提交
内容的提问来源于stack exchange,提问作者Ivan W
相关产品推荐
相关产品推荐

