Как записывать в БД имя пользователя?

@bot.message_handler(commands=['subscribe'])
def start(message):

    connect = sqlite3.connect('users5.db')

    cursor = connect.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS login_id(
        id INTEGER PRIMARY KEY,
        user_name TEXT NOT NULL UNIQUE)""")

    connect.commit()

    people_id = message.chat.id
    user1_name = message.chat.first_name
    cursor.execute(f"SELECT id FROM login_id WHERE id = {people_id}")
    cursor.execute(f"SELECT user_name FROM login_id WHERE user_name = {user1_name} ")
    data = cursor.fetchone()
    if data is None:
        users_id = [message.chat.id, 'user_name']
        cursor.execute("INSERT INTO login_id VALUES(?);", users_id)
        connect.commit()
        bot.send_message(message.chat.id, 'Ты подписался_ась на рассылку✅')
    else:
        bot.send_message(message.chat.id, 'Ты уже подписан?')

Как сделать чтобы кроме айди пользователя записывать имя пользователя, я вот вроде что то пытался сделать но не получилось.


Ответы (2 шт):

Автор решения: NoobCoder

Ты получается записываешь только юзер айди, для того чтобы записать еще и имя пользователя напиши отредактируй:

users_id = message.chat.id
first_name = message.chat.first_name
cursor.execute("INSERT INTO login_id VALUES(?, ?);", (users_id, f'{first_name}')) 

Полный код:

import telebot
import sqlite3
from telebot.types import Message

bot = telebot.TeleBot(token="6930726784:AAEsOqe0QfHt3RGbbwpBzmc88vFKb8XNdL8")

@bot.message_handler(commands=['subscribe'])
def subscribe(message: Message):
connect = sqlite3.connect('users5.db')

cursor = connect.cursor()

cursor.execute("""CREATE TABLE IF NOT EXISTS login_id(
id INTEGER PRIMARY KEY,
user_name TEXT NOT NULL UNIQUE)""")

connect.commit()

people_id = message.chat.id
user1_name = message.chat.first_name
cursor.execute(f"SELECT id FROM login_id WHERE id = '{people_id}'")
cursor.execute(f"SELECT user_name FROM login_id WHERE user_name = '{user1_name}' ")
data = cursor.fetchone()
if data is None:
    users_id = message.chat.id
    first_name = message.chat.first_name
    cursor.execute("INSERT INTO login_id VALUES(?, ?);", (users_id, f'{first_name}'))
    connect.commit()
    bot.send_message(message.chat.id, 'Ты подписался_ась на рассылку✅')
else:
    bot.send_message(message.chat.id, 'Ты уже подписан?')  
    
bot.polling()
→ Ссылка
Автор решения: Errors

Когда-то писал оболочку для sqlite3, немного переделал для тебя, мб поможет?

from sqlite3 import connect, Cursor, Connection
from abc import ABC, abstractmethod
from typing import Iterable
from os.path import basename


class DataBase(ABC):
    def __init__(self, db_name: str) -> None:
        self.__db_name = db_name
        self._table_name = basename(db_name).replace('.db', '')
        self.__db: Connection = connect(db_name)
        self.__curs: Cursor = self.__db.cursor()
        self.__create_table()

    def get_all_data(self) -> list:
        self.__curs.execute(f'SELECT * FROM {self._table_name}')
        return self.__curs.fetchall()

    def get_rows(self, **params) -> list:
        params = ', '.join(f'{k}={repr(v)}' for k, v in params.items())
        self.__curs.execute(f'SELECT * FROM {self._table_name} WHERE {params}')
        return self.__curs.fetchall()

    def write_data(self, fields: list[str], values: Iterable) -> None:
        data, fields = ', '.join(map(repr, values)), ', '.join(fields)
        command = f'INSERT INTO {self._table_name} ({fields}) VALUES ({data})'
        self.__curs.execute(command)

    def del_rows(self, **params) -> None:
        params = ', '.join(f'{k}={repr(v)}' for k, v in params.items())
        self.__curs.execute(f'DELETE FROM {self._table_name} WHERE {params}')

    def run_command(self, command: str, *params) -> list:
        self.__curs.execute(command, *params)
        return self.__curs.fetchall()

    @abstractmethod
    def _get_table(self) -> str:
        pass

    def __create_table(self) -> None:
        self.__curs.execute(self._get_table())

    def __enter__(self) -> 'DataBase':
        return self

    def __exit__(self, exc_type, exc_val, exc_tb) -> None:
        if exc_type: del self

    def __del__(self) -> None:
        self.__db.commit()
        self.__db.close()

    def __str__(self):
        return f'[DataBase: {self.__class__.__name__}]'


class UsersDB(DataBase):
    def _get_table(self) -> str:
        return f'''CREATE TABLE IF NOT EXISTS {self._table_name} (
                   id INTEGER PRIMARY KEY AUTOINCREMENT,
                   user_name TEXT NOT NULL UNIQUE)
                '''

    def get_row_by_id(self, id_row: int) -> tuple[int, str]:
        return self.get_rows(id=id_row)[-1]

    def write_data(self, user_name: str) -> None:
        fields = ('user_name', )
        values = (user_name, )
        super().write_data(fields, values)

    def del_row_by_id(self, id_row: int) -> None:
        self.del_rows(id=id_row)


if __name__ == '__main__':
    with UsersDB('test_users_db.db') as db:
        print('Writing data...')
        db.write_data('Errors')
        db.write_data('Alexa')
        db.write_data('Bob')
        print(db.get_all_data(), "- it's get_all_data(),")
        print(db.get_rows(user_name='Bob'), "- it's get_rows() (select by user_name='Bob'),")
        print(db.get_row_by_id(2), "- it's get_row_by_id(),")
        db.del_row_by_id(2); print('the "del_row_by_id" method is launched.')
        print(db.get_all_data())
        db.del_rows(user_name='Alexa'); print("the \"del_rows\" method is launched (deletes by user_name='Bob').")
        print(db)
→ Ссылка