@Defbot

Ошибка в коде телеграм бота при подключении к Postgresql?

Код для записи ID пользователя в базу на сервер и рассылки сообщений пользователям.
На сервере создается таблица, но данные в таблицу не добавляются. Прошу помощи!
import psycopg2 as ps

base = ps.connect(DATABASE_URL, sslmode='require')
cur = base.cursor()

async def main_menu (message):
    cur.execute("""CREATE TABLE IF NOT EXISTS log_id(us_id INTEGER)""")
    base.commit()
    user_id = message.chat.id
    cur.execute(f"SELECT * FROM log_id WHERE us_id = (%s);, {user_id}")
    data = cur.fetchone()
    if data is None:
        cur.execute("INSERT INTO log_id (us_id) VALUES (%s);", (user_id,))
        base.commit()
    else:
        pass
    await bot.send_message(message.from_user.id, "Привет, {}!".format(message.from_user.first_name))
    await bot.send_message(message.from_user.id, "Выбери категорию  \U00002B07",
                           reply_markup=mainmenu_kb)

async def sendall(message: types.Message):
    if message.chat.type == 'private':
        if message.from_user.id == ADMIN:
            text = message.text[9:]
            users = cur.execute("SELECT us_id, active FROM log_id").fetchall()
            for row in users:
                try:
                    await bot.send_message(row[0], text)
                    if int(row[1]) != 1:
                        user_id = row[0]
                        active = row[1]
                        cur.execute("UPDATE log_id SET active = %s WHERE us_id = %s;", (us_id, active))(row[0], 1)
                        base.commit()
                except:
                    user_id = row[0]
                    active = row[1]
                    cur.execute("UPDATE log_id SET active = %s WHERE us_id = %s;", (us_id, active))(row[0], 0)
                    base.commit()
            await bot.send_message(message.from_user.id, "Успешная рассылка!")
  • Вопрос задан
  • 50 просмотров
Пригласить эксперта
Ответы на вопрос 1
a777mp198
@a777mp198
Python developer
Попробуйте заменить user_id = message.chat.id на user_id = message.from_user.id
в функции main_menu. И если таблица создалась, можно убрать из кода
cur.execute("""CREATE TABLE IF NOT EXISTS log_id(us_id INTEGER)""")
    base.commit()

И лучше значение стобца us_id INTEGER поменять на BIGINT, так как некоторые user_id могут быть большими, и соответственно БД может их не принять в данный столбец.
Так же, я бы рекомендовал открывать соединение с БД в каждой функции где она используется, а не глобально.
async def main_menu (message):
    base = ps.connect(DATABASE_URL, sslmode='require')
    cur = base.cursor()
    user_id = message.from_user.id
    cur.execute("SELECT * FROM log_id WHERE us_id = %s;", (user_id, ))
    data = cur.fetchone()
    if data is None:
        cur.execute("INSERT INTO log_id (us_id) VALUES (%s);", (user_id, ))
        base.commit()
        cur.close()
    else:
        base.commit()
        cur.close()
    await bot.send_message(message.from_user.id, "Привет, {}!".format(message.from_user.first_name))
    await bot.send_message(message.from_user.id, "Выбери категорию  \U00002B07",
                           reply_markup=mainmenu_kb)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы