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

请求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. 测试一下

  1. 确保你的PostgreSQL服务已经启动,数据库和表都准备好了
  2. 把代码里的BOT_TOKEN和DATABASE_URL换成你自己的
  3. 运行代码,然后给Bot发/start命令
  4. 去你的PostgreSQL数据库里查users表,应该能看到刚发送命令的用户信息啦!

一些小提示

  • 如果遇到连接错误,先检查数据库URL的用户名、密码、主机、端口是不是都对
  • ON CONFLICT (user_id) DO NOTHING是为了防止同一个用户多次触发存储操作时重复插入,避免报错
  • 生产环境建议用连接池,而不是每次操作都新建连接,能提升性能

备注:内容来源于stack exchange,提问作者PRIST LEGACY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:37:38