请求TeleBot连接PostgreSQL数据库URL并存储用户数据的教程
TeleBot连接PostgreSQL数据库URL并存储用户数据的教程
嘿,我来一步步带你搞定把TeleBot和PostgreSQL数据库对接,存储用户的加入日期及相关信息的事儿,咱们一步步来:
1. 先装必要的依赖包
你已经在用pytelegrambotapi了,现在还需要PostgreSQL的Python驱动,打开终端跑这个命令:
pip install pytelegrambotapi psycopg2-binary
psycopg2-binary是预编译的版本,安装起来更省心,不用自己编译依赖。
2. 准备数据库连接URL
PostgreSQL的连接URL格式是这样的:
postgresql://<用户名>:<密码>@<数据库主机>:<端口>/<数据库名称>
比如你的数据库在本地,用户名是postgres,密码123456,数据库名bot_users,那URL就是:
postgresql://postgres:123456@localhost:5432/bot_users
注意:生产环境别直接把密码写在代码里,建议用环境变量来存,比如os.getenv("DATABASE_URL"),更安全!
3. 创建存储用户的数据库表
先给你的数据库建个表,用来存用户信息。你可以直接在PostgreSQL客户端(比如pgAdmin)里执行这段SQL,或者用代码自动创建:
CREATE TABLE IF NOT EXISTS users ( user_id BIGINT PRIMARY KEY, -- Telegram用户的唯一ID username VARCHAR(255), first_name VARCHAR(255), last_name VARCHAR(255), join_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 自动记录加入时间 );
这个表会自动把用户加入的时间设为当前时间,不用你手动传。
4. 修改你的TeleBot代码,集成数据库操作
把你原来的代码改成这样,我加了详细注释:
from telebot import TeleBot from telebot.types import Message from telebot.apihelper import ApiTelegramException import psycopg2 from psycopg2 import OperationalError # 替换成你的Bot Token BOT_TOKEN = "590----86:AAF9_DU9F_6----rvls26HgJMzHyJJpY" # 替换成你的PostgreSQL连接URL DATABASE_URL = "postgresql://postgres:123456@localhost:5432/bot_users" CHAT_ID = '@pristbank' # 替换你的频道ID bot = TeleBot(BOT_TOKEN) def create_connection(): """创建数据库连接的辅助函数""" connection = None try: connection = psycopg2.connect(DATABASE_URL) print("数据库连接成功!") except OperationalError as e: print(f"连接出错:{e}") return connection def save_user_to_db(user_id, username, first_name, last_name): """把用户信息存入数据库""" connection = create_connection() if connection: try: cursor = connection.cursor() # 用INSERT ... ON CONFLICT避免重复插入同一个用户 insert_query = """ INSERT INTO users (user_id, username, first_name, last_name) VALUES (%s, %s, %s, %s) ON CONFLICT (user_id) DO NOTHING; """ cursor.execute(insert_query, (user_id, username, first_name, last_name)) connection.commit() print(f"用户 {user_id} 信息已保存/更新") except psycopg2.Error as e: print(f"存储用户出错:{e}") connection.rollback() finally: cursor.close() connection.close() # 处理/start命令,用户首次互动时存储信息 @bot.message_handler(commands=['start']) def handle_start(message: Message): user = message.from_user # 调用函数存储用户信息 save_user_to_db(user.id, user.username, user.first_name, user.last_name) bot.reply_to(message, "欢迎使用!你的信息已经被记录啦~") # 可选:处理所有消息,确保任何互动都记录用户(如果需要的话) @bot.message_handler(func=lambda message: True) def handle_all_messages(message: Message): user = message.from_user save_user_to_db(user.id, user.username, user.first_name, user.last_name) # 这里可以加你原来的消息处理逻辑 bot.send_message(CHAT_ID, f"收到用户 {user.first_name} 的消息:{message.text}") if __name__ == "__main__": print("Bot启动中...") bot.infinity_polling()
5. 测试一下
- 确保你的PostgreSQL服务已经启动,数据库和表都准备好了
- 把代码里的
BOT_TOKEN和DATABASE_URL换成你自己的 - 运行代码,然后给Bot发
/start命令 - 去你的PostgreSQL数据库里查
users表,应该能看到刚发送命令的用户信息啦!
一些小提示
- 如果遇到连接错误,先检查数据库URL的用户名、密码、主机、端口是不是都对
ON CONFLICT (user_id) DO NOTHING是为了防止同一个用户多次触发存储操作时重复插入,避免报错- 生产环境建议用连接池,而不是每次操作都新建连接,能提升性能
备注:内容来源于stack exchange,提问作者PRIST LEGACY
相关产品推荐
相关产品推荐

