Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2016 14:57:36

fromrsu
Зарегистрирован: 2016-10-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

Добрый день.

Имеется задача отправить в сообщении Telegram содержимое БД.
Прошу помочь - как в Python можно выгрузить содержимое БД, чтобы потом отправить полученный массив единым текстовым сообщением в мессенджере?
Проблем с отправкой, вроде нет, но не знаю как этот массив преобразовать в единый текст.
Прошу помочь с этим.

Офлайн

#2 Окт. 21, 2016 15:13:14

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

А зачем тут питон вообще?
Любая СУБД умеет делать дамп.



Офлайн

#3 Окт. 21, 2016 15:19:22

fromrsu
Зарегистрирован: 2016-10-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

FishHook
А зачем тут питон вообще?Любая СУБД умеет делать дамп.
Бот, отправляющий сообщение, написан на питоне, поэтому обращение к БД буду делать там же, внутри бота.
С СУБД, также, знакомство весьма поверхностное, поэтому задача для меня нетривиальная.

Офлайн

#4 Окт. 21, 2016 15:33:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

Дамп mysql делается одной командой, это 20 букв примерно, что может быть проще?
Вы б погуглили сначала.



Офлайн

#5 Окт. 21, 2016 15:35:05

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

fromrsu
вы сейчас не путаете содержимое базы (дамп) и данные из базы (результат определенного запроса в бд) ?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Окт. 21, 2016 15:43:02

fromrsu
Зарегистрирован: 2016-10-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

FishHook
Если Вы про c.execute('SELECT * FROM webafisha').fetchall() , то это мне не особо пока помогает, поскольку не понимаю, что с этим делать дальше.

JOHN_16
Возможно и путаю, последний раз занимался программированием еще очень давно в школе, поэтому вспоминаю с трудом. Прошу извинить, если выразился некорректно.
Попытаюсь объяснить иначе. У меня есть в БД таблица, в которую сливаются определенные данные. Нужно из этой таблицы построчно вытащить информацию для того, чтобы можно было отправить ботом пользователю.
Делать простой вариант с отправкой каждой строки отдельно очень не хочется, поскольку строк около 20 и это будет спам-рассылкой (по эффекту для пользователя). Поэтому желательно содержимое этих строк слить в какой-то единый текст, который можно было бы отправить пользователю.

Офлайн

#7 Окт. 21, 2016 16:04:47

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

fromrsu
То есть вам надо 1) получить данные из БД 2) Преобразовать их в читаемый для пользователя набор строк 3) отправить это через телеграм.
Как решить первый пункт вы знаете - запрос к БД. Второй пункт видимо для вашей задачи основной - вряд ли пользователя устроит чистый вывод SQL запроса. Нужно сформировать строку из данных которые есть в выдаче запроса. Как это сделать - наверняка вы знаете.
Если вы искали готовых решений то врядли они будут - ваши данные знаете как преобразовывать только вы. Мы ничего о них не знаем.
Задача не трудная.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Окт. 21, 2016 16:29:06

fromrsu
Зарегистрирован: 2016-10-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

JOHN_16
К сожалению, второй пункт, как раз для меня и проблемный.
Я не ищу готового решения, а пытаюсь понять что необходимо сделать (какие конкретно команды) используются для решения эта задачи.
По первому и третьему пункту Вы правы - решение знаю. Но буду признателен, если поможете со вторым пунктом.
Таблица формата “rowid”/“title”/“category”/“date”, где столбцы 2-4 в обычном текстовом формате. Собственно, что с ними дальше делать после c.execute('SELECT * FROM webafisha').fetchall() для того, чтобы они были единым текстом?

Офлайн

#9 Окт. 21, 2016 20:33:52

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

Может как то так

 c.execute('SELECT * FROM webafisha')
text = '\n'.join( [', '.join(map(str, x)) for x in c] )



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Окт. 21, 2016 22:02:26

fromrsu
Зарегистрирован: 2016-10-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка в сообщении содержимого БД

JOHN_16
c.execute('SELECT * FROM webafisha')
text = ‘\n’.join( )

Да, так получилось отправить! Большое спасибо!
До Вашей помощи я пошел в какие-то дебри и сделал так:
 for i in c.fetchall():
        row1.append(i)
text = str(row1[0]) + '\n\n' + str(row1[1]) + '\n\n' + str(row1[3])
user_markup = telebot.types.ReplyKeyboardMarkup(True, False)
bot.send_message(message.from_user.id, text, reply_markup=user_markup)

И завис над вопросом о том, что делать для ситуации когда количество строк неизвестно и пещерным методом, путем перебора вручную, их не поставить.

Если кому-то из новичков будет интересно, можете использовать готовый хендлер, который отправляет пользователю в Telegram, по команде /kino информацию из БД.
 @bot.message_handler(commands=['kino'])
def films(message):
    # Подключаемся к БД, которая прописана в отдельном файле constants и приравнена к database_name_films
    conn = sqlite3.connect(constants.database_name_films)
    c = conn.cursor()
    # Запрос данных в БД
    c.execute('SELECT * FROM webafisha')
    # Делаем слияние строк в один текстовый блок
    text = '\n\n'.join([', '.join(map(str, x)) for x in c])
    # Закрываем подключение к БД
    c.close()
    conn.close()
    # Определяем параметры пользовательской клавиатуры в боте
    user_markup = telebot.types.ReplyKeyboardMarkup(True, False)
    # Отрисовываем клавиатуру - тут рисуете свои кнопки (в моем проекте задействованы такие)
    user_markup.row('/ugadaiki', '/sticker', '/kino')
    # Отправка сообщения пользователю по конкретному from_user.id, который получаете из Message
    bot.send_message(message.from_user.id, text, reply_markup=user_markup)

P.S. Использую \n\n вместо \n по причине того, что когда строки идут без разделителей, текст несколько сливается в маленьком экране.

Отредактировано fromrsu (Окт. 21, 2016 22:16:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version