You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:45:03