@ivakhiv

Как сделать чтобы в sqlite id людей бота не повторялись?

Как сделать чтобы в sqlite id людей бота не повторялись?

И как потом сделать рассылку чтобы можно было прекрепить инлайн кнопку,картинку и к нему фотку в одном сообщении?
  • Вопрос задан
  • 699 просмотров
Пригласить эксперта
Ответы на вопрос 3
hottabxp
@hottabxp
Сначала мы жили бедно, а потом нас обокрали..
Как сделать чтобы в sqlite id людей бота не повторялись?
Перед тем, как добавить id в базу, проверяйте на наличие этого id в базе.

И как потом сделать рассылку чтобы можно было прекрепить инлайн кнопку,картинку и к нему фотку в одном сообщении?

Почитать доки. Там есть и примеры, в том числе.
Ответ написан
dabudi
@dabudi
2*2=5
Можно так попробовать

userid = message.chat.id
with sq.connect('base.db') as con:
    cur = con.cursor() 
    cur.execute('''SELECT userid FROM users''')
    ALLuser = cur.fetchall()

if userid in ALLuser:
    print('Такой ID уже есть')
else:
    with sq.connect('base.db') as con:
    cur = con.cursor() 
    cur.execute('''INSERT INTO users(userid) VALUES(?)''', (userid))


И как потом сделать рассылку чтобы можно было прекрепить инлайн кнопку,картинку и к нему фотку в одном сообщении?

Рассылку можно сделать так

with sq.connect('base.db') as con:
    cur = con.cursor()
    cur.execute('''SELECT userid FROM user''')
    AllUser = cur.fetchall()
    
count = 0
errors = 0

start_time = time.time()
for s in range(len(AllUser)):
    user_id = AllUser[count][0]
    try:
        bot.send_message(user_id, text='Текст для рассылки')
        count += 1
    except:
        count += 1
        errors += 1
        
allusers = int(len(dataid))
goodresult = allusers - errors
goodresult = str(goodresult)

errors = str(errors)
times = "Время выполнения: %s сек." % round((time.time() - start_time))
timesstr = times
sms = 'Рассылка завершена!'+'\n'+ 'Успешных результатов: '+goodresult+'\n'+'Ошибок: '+errors+'\n'+timesstr
bot.send_message(твой_айди, sms)# сюда придет уведомление о результатах рассылки
Ответ написан
@o5a
Для SQL базы правильнее будет объявить уникальность поля (UNIQUE/PRIMARY KEY), и затем при вставке можно не делать самостоятельных проверок, дубликаты итак не будут заноситься.

При создании таблицы:
CREATE TABLE users (
user_id INTEGER PRIMARY KEY # чтобы заполнялся автоматически, тогда вообще не нужно указывать id, он всегда будет проставляться автоматом новый
user_name TEXT);

Тогда при вставке не нужно вообще использовать user_id, оно будет проставляться автоматически
cur.execute('''INSERT INTO users(user_name) VALUES(?)''', (user_name, ))


или
CREATE TABLE users (
user_id INTEGER UNIQUE, # если планируется самостоятельно заносить id
user_name TEXT);

Тогда user_id нужно проставлять самому, но проверку дубликатов делать тоже не придется, если указать OR IGNORE
cur.execute('''INSERT OR IGNORE INTO users(user_id, user_name) VALUES(?, ?)''', (user_id, user_name))
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы