Как записывать в БД имя пользователя?
@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)