首页 > 编程问答 >Python Telegram Bot 从数据库获取数据时出错

Python Telegram Bot 从数据库获取数据时出错

时间:2024-08-05 16:18:39浏览次数:6  
标签:python sqlite telegram-bot aiogram

我正在开发用于管理企业用途任务的电报机器人。团队负责人注册他的公司并获得唯一的ID,然后可以分配任务。问题是,当团队负责人分配任务时,他可以使用 /viewtasks 访问它们。但是,当员工尝试查看任务时,它会打印出“错误。您尚未注册”。

似乎无法检索与用户关联的 company_id,即使它已使用此 ID 注册。我的代码如下。请注意,我正在使用 aiogram 库

感谢您的帮助!

这是我的代码:

@dp.message(Command("viewtasks")) 异步 def view_tasks(消息: 消息): user_id = 消息.from_user.id logging.debug(f"用户 ID: {user_id}")

# Fetch user details
cursor.execute("SELECT company_id, role FROM users WHERE id = ?", (user_id,))
result = cursor.fetchone()
logging.debug(f"User details fetched for user ID {user_id}: {result}")

if not result:
    await message.answer("Error. You are not registered")
    return


company_id, role = result
# Fetch tasks associated with the user
if role == 'team_lead':
    cursor.execute("SELECT task FROM tasks WHERE company_id = ?", (company_id,))
else:
    cursor.execute("SELECT task FROM tasks WHERE user_id = ?", (user_id,))

tasks = cursor.fetchall()

# Debugging: Log the fetched tasks
logging.debug(f"Fetched tasks for user {user_id} role: {role}: {tasks}")

if not tasks:
    await message.answer("No tasks")
else:
    response = "\n".join([task[0] for task in tasks])
    await message.answer(response)

这是我的数据库 (sqlite):

cursor.execute(''' 如果不存在则创建表用户( id 整数主键自动增量, 用户名文本, 电子邮件文本, 公司 ID 整数, 角色文本, 外键(company_id)参考公司(company_id)) ''')

cursor.execute(''' 如果不存在则创建表任务( id 整数主键自动增量, 用户 ID 整数, 任务文本, due_date 文本, 公司 ID 整数, 外键(user_id)引用用户(id), 外键(company_id)参考公司(company_id)) ''')

conn.commit()


代码的问题在于,你正在使用 user_id 作为 users 表中的主键,但在 Telegram 中,它不是唯一的。你需要使用 Telegram 的 user_id (即 message.from_user.id ) 来查找用户的唯一 ID,然后使用该 ID 从数据库中检索信息。

以下是修改后的代码:

@dp.message(Command("viewtasks"))
async def view_tasks(message: Message):
    telegram_user_id = message.from_user.id
    logging.debug(f"Telegram User ID: {telegram_user_id}")

    # Fetch user details using Telegram user ID
    cursor.execute("SELECT id, company_id, role FROM users WHERE telegram_id = ?", (telegram_user_id,))
    result = cursor.fetchone()
    logging.debug(f"User details fetched for Telegram user ID {telegram_user_id}: {result}")

    if not result:
        await message.answer("Error. You are not registered.")
        return

    user_id, company_id, role = result

    # Fetch tasks associated with the user
    if role == 'team_lead':
        cursor.execute("SELECT task FROM tasks WHERE company_id = ?", (company_id,))
    else:
        cursor.execute("SELECT task FROM tasks WHERE user_id = ?", (user_id,))

    tasks = cursor.fetchall()

    # Debugging: Log the fetched tasks
    logging.debug(f"Fetched tasks for user {user_id} role: {role}: {tasks}")

    if not tasks:
        await message.answer("No tasks.")
    else:
        response = "\n".join([task[0] for task in tasks])
        await message.answer(response)

你需要对数据库进行以下更改:

  1. 添加 telegram_id 列到 users 表:

sql ALTER TABLE users ADD COLUMN telegram_id INTEGER;

  1. 在用户注册时存储 telegram_id

在用户注册过程中,你需要将 message.from_user.id 存储到 users 表的 telegram_id 列中。

通过这些修改,你的机器人应该能够正确地识别用户并检索他们的任务。

标签:python,sqlite,telegram-bot,aiogram
From: 78831964

相关文章

  • 在 Glue 作业中使用 python3+ 创建 CloudFront 签名 URL
    是否可以使用python3+为GlueJob中S3文件中的一个特定文件创建具有一定时间限制的CloudFront签名URL?我看到可以在Lambda中做到这一点,但在Python文档中找不到任何内容,特别是胶水工作。任何人都可以提供一些提示吗?defload_private_key(key_path):withopen(......
  • 【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析、扩展列表解析语法等,对列表解析不懂的同学着重推荐......
  • 如何获取部署在 Azure 应用服务上并通过 Microsoft 身份提供商进行身份验证的 Python
    我使用PythonDash包构建了一个Web应用程序,并将该应用程序部署在Azure应用服务上。Web应用程序当前通过Azure门户的应用程序服务使用Microsoft身份提供程序进行身份验证。但是如何获取登录用户的详细信息呢?在本地运行时如何验证我的Web应用程序?我当前的登录流......
  • 使用 Python 打印此图案
    1010101010101010使用python打印此我已经尝试过defprint_pattern(rows):foriinrange(rows):start_char='1'ifi%2==0else'0'pattern=''.join(start_charifj%2==0else('0'ifs......
  • python discord bot nextcord 斜线命令 更改语言
    我想根据用户的不和谐语言更改斜杠命令的名称。如果语言是韩语/서버如果语言是英语/服务器像这样。我可以使用ctx.locale更改里面的内容,但我也想更改名称和描述。我应该怎么办?当我问ChatGPT时,他们说的很奇怪,谷歌上也没有任何信息。但是有一个机器人可以根据语言......
  • 学习Python的书籍推荐--《Python编程从入门到实践》
    版权信息:书名:Python编程:从入门到实践(第3版)作者:[美]埃里克·马瑟斯(EricMatthes)译者:袁国忠评价:1.北京邮电大学副教授陈光老师是这样评价的:    编程教学之道,一是重在实践,二是循序渐进一一通过巧妙的实战项目,激发和保持学习的热情,让学习渐入佳境。在这两方......
  • 我可以将 Python 与 javascript 结合起来用于网站或应用程序吗
    我不知道如果j添加Python和javascript可以吗我尝试过。但决定在继续之前询问一下是否可以继续但是如果我只使用javascript还是只使用python会更好吗?我只需要建议或答案将Python与Javascript结合用于网站或应用程序不仅完全可行,而且也是一种非常常见的做法!二者......
  • Python 网络抓取与请求和美丽的汤被需要 javascript 阻止
    我正在尝试从网站上抓取文本。我使用简单的代码:requests.get(url_here)。我的代码直到最近才有效。现在,当我使用请求时,我收到一条消息,而不是获取网站的文本:“该网站需要启用JavaScript!您使用的浏览器不支持JavaScript,或者已关闭JavaScript。“我已验证我的浏览器确实......
  • python实现局域网及广域网私人聊天(Socket库局域网应用)
    引言在当今这个数字化时代,即时通讯已成为我们日常生活的一部分。无论是通过手机还是电脑,人们都在寻找更高效、更私密的沟通方式。想象一下,在你自己的局域网内,与朋友或同事建立一个专属的聊天室,无需担心数据泄露或者被第三方监听。本文将引导你从零开始,利用Python和Socket库......
  • 使用 python 抓取网页
    我有以下网页</div><ahref="https://www.emag.ro/laptop-lenovo-thinkbook-15-iil-cu-procesor-intel-core-i7-1065g7-pana-la-3-90-ghz-15-6-full-hd-16gb-512gb-ssd-intel-iris-plus-graphics-free-dos-mineral-grey-20sm003jrm/pd/DKBK1TMBM/#reviews-section&......