kan3k1k3n
@kan3k1k3n

Как запустить код телеграм бота на python в pythonanywhere?

фрагмент кода для подключения к базе данных postgre:
def open_database_connection():
    db_name = connect_text.get('dbname', '...')
    user_name = connect_text.get('user', '...')
    password = connect_text.get('password', '...')
    tableName = table_name.get('t_name', '...')
    conn = psycopg2.connect(dbname=db_name, user=user_name, password=password, host='127.0.0.1')
    cur = conn.cursor()
    return conn, cur

если запускать в пайчарме, то все работает, подключается, но когда я закинул мой код на платформу pythonanywhere, то вылезает ошибка:
File "/home/draindoggy228/create_table_tg_bot_2.0.py", line 24, in open_database_connection
    conn = psycopg2.connect(dbname=db_name, user=user_name, password=password, host='127.0.0.1')
  File "/home/draindoggy228/.virtualenvs/myenvvv/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: connection to server at "127.0.0.1", port 5432 failed: Connection refused
        Is the server running on that host and accepting TCP/IP connections?

что нужно сделать, чтобы бот стабильно работал и подключался к базе данных?

p.s вот полный код:
import os
import telebot
import psycopg2

bot = telebot.TeleBot('токен')

connect_text = {}
table_name = {}
columns = {}

commands = [
    telebot.types.BotCommand('start', 'запустить бота'),
    telebot.types.BotCommand('create_table', 'создать таблицу'),
    telebot.types.BotCommand('insert_data', 'вставить данные в таблицу'),
    telebot.types.BotCommand('delete_row', 'удалить данные из таблицы'),
    telebot.types.BotCommand('open', 'открыть pgAdmin 4')]
bot.set_my_commands(commands)

def open_database_connection():
    db_name = connect_text.get('dbname', '...')
    user_name = connect_text.get('user', '...')
    password = connect_text.get('password', '...')
    tableName = table_name.get('t_name', '...')
    conn = psycopg2.connect(dbname=db_name, user=user_name, password=password, host='127.0.0.1')
    cur = conn.cursor()
    return conn, cur

@bot.message_handler(commands=['start'])
def start(message):
    user_name = message.from_user.first_name
    bot.reply_to(message, 'привет, {0}'.format(user_name) + '\nотправь мне данные для создания таблицы, \nи она появится в твоей базе данных PostgreSQL')
    bot.send_message(message.chat.id, 'введите название базы данных:')
    bot.register_next_step_handler(message, get_dbname)

def get_dbname(message):
    connect_text['dbname'] = message.text
    bot.send_message(message.chat.id, 'введите имя пользователя:')
    bot.register_next_step_handler(message, get_username)

def get_username(message):
    connect_text['user'] = message.text
    bot.send_message(message.chat.id, 'введите пароль:')
    bot.register_next_step_handler(message, get_password)

def get_password(message):
    connect_text['password'] = message.text
    conn, cur = open_database_connection()
    if conn.closed == 0:
        bot.send_message(message.chat.id, 'соединение установлено!')
    else:
        bot.send_message(message.chat.id, 'соединение не установлено((')
    cur.close()
    conn.close()

@bot.message_handler(commands=['create_table'])
def named_table(message):
    bot.send_message(message.chat.id, 'введите название таблицы:')
    bot.register_next_step_handler(message, create_table)

def create_table(message):
    table_name['t_name'] = message.text
    bot.send_message(message.chat.id, 'введите количество колонок:')
    bot.register_next_step_handler(message, get_column_names)

def get_column_names(message):
    try:
        num_columns = int(message.text)
    except ValueError:
        bot.send_message(message.chat.id, 'некорректное количество колонок. попробуйте еще раз.')
        bot.register_next_step_handler(message, get_column_names)
        return
    bot.send_message(message.chat.id, 'введите название и тип данных для колонки 1 (через пробел):')
    bot.register_next_step_handler(message, get_column_info, 1, num_columns, [])

def get_column_info(message, column_num, num_columns, column_names):
    column_info = message.text.split()
    if len(column_info) != 2:
        bot.send_message(message.chat.id, 'некорректный ввод. попробуйте еще раз.')
        bot.register_next_step_handler(message, get_column_info, column_num, num_columns, column_names)
        return
    columns[column_info[0]] = column_info[1]
    column_names.append(column_info[0])
    if column_num < num_columns:
        bot.send_message(message.chat.id, f'введите название и тип данных для колонки {column_num+1} (через пробел):')
        bot.register_next_step_handler(message, get_column_info, column_num+1, num_columns, column_names)
    else:
        conn, cur = open_database_connection()
        querry = f"CREATE TABLE {table_name['t_name']} ({', '.join([f'{col} {columns[col]}' for col in columns])})"
        cur.execute(querry)
        conn.commit()
        column_names_str = ' | '.join(column_names)
        bot.send_message(message.chat.id, f'ваша таблица {table_name["t_name"]} выглядит вот так:\n{column_names_str}')
        cur.close()
        conn.close()

@bot.message_handler(commands=['insert_data'])
def get_column_values(message):
    conn, cur = open_database_connection()
    cur.execute(f"SELECT column_name FROM information_schema.columns WHERE table_name='{table_name['t_name']}'")
    rows = cur.fetchall()
    column_names = [row[0] for row in rows]
    global column_names_str
    column_names_str = ", ".join(column_names)
    bot.send_message(message.chat.id, f'введите данные для всех столбцов через пробел ({column_names_str}):')
    cur.close()
    conn.close()
    bot.register_next_step_handler(message, insert_data, column_names)

def insert_data(message, column_names):
    conn, cur = open_database_connection()
    values = message.text.strip().split()
    if len(values) != len(column_names):
        bot.send_message(message.chat.id, f'неверное количество значений. введите данные для всех {len(column_names)} столбцов.')
        bot.register_next_step_handler(message, insert_data, column_names)
        return
    values_str = ', '.join([f"'{value}'" for value in values])
    cur.execute(f"INSERT INTO {table_name['t_name']} ({column_names_str}) VALUES ({values_str})")
    conn.commit()
    bot.send_message(message.chat.id, f'данные "{values_str}" успешно добавлены в столбцы {column_names_str}\nхотите добавить что-то еще? (y/n)')
    cur.close()
    conn.close()
    bot.register_next_step_handler(message, get_answer, column_names)

def get_answer(message, column_names):
    answer = message.text
    if answer == 'y':
        conn, cur = open_database_connection()
        cur.execute(f"SELECT column_name FROM information_schema.columns WHERE table_name='{table_name['t_name']}'")
        rows = cur.fetchall()
        column_names = [row[0] for row in rows]
        cur.close()
        conn.close()
        bot.send_message(message.chat.id, f'введите данные для всех столбцов через пробел ({", ".join(column_names)}):')
        bot.register_next_step_handler(message, insert_data, column_names)
    else:
        bot.send_message(message.chat.id, 'хорошо, рад был помочь')

@bot.message_handler(commands=['delete_row'])
def delete_row(message):
    bot.send_message(message.chat.id, 'введите номер строки для удаления:')
    bot.register_next_step_handler(message, delete_row_by_number)

def delete_row_by_number(message):
    try:
        row_num = int(message.text)
    except ValueError:
        bot.send_message(message.chat.id, 'некорректный номер строки. попробуйте еще раз.')
        return

    conn, cur = open_database_connection()
    querry = f"DELETE FROM {table_name['t_name']} WHERE ctid IN (SELECT ctid FROM {table_name['t_name']} LIMIT 1 OFFSET {row_num-1})"
    cur.execute(querry)
    conn.commit()

    if cur.rowcount == 0:
        bot.send_message(message.chat.id, 'строка с таким номером не найдена.')
    else:
        bot.send_message(message.chat.id, f'строка {row_num} удалена')
    cur.close()
    conn.close()

@bot.message_handler(commands=['open'])
def start_pg(message):
    os.startfile('C:/Program Files/PostgreSQL/15/pgAdmin 4/bin/pgAdmin4.exe')

if __name__ == '__main__':
    bot.infinity_polling(none_stop=True)
  • Вопрос задан
  • 312 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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