Далі - код не буває "адекватним" сам по собі; він може бути адекватним певним обставинам, а ви про ці обставини ніц не написали. Наприклад, якщо вся програма - це скриптик на колінці на 10 рядків, а задля нього ви створюєте такий клас - він, схоже, буде неадекватним. Так само якщо у вас є чітко виділений бізнес-код з певними вимогами до адаптера БД, він може бути неадекватним цим вимогам, але ж ви про це нічого не пишете.
Наступне питання - структура БД у вас неадекватна усім розумним вимогам до БД. Ви, як я зрозумів, замість зберігати однотипні дані в одній таблиці, створюєте різні таблиці з однаковою структурою. Нащо ви це робите?
А тепер по коду:
- що за назва "SQLighte"? Що вона означає? Просто випадковий набір символів, що, на вашу думку, має вимовлятися співзвучно з назвою БД? Назви мають відповідати змісту.
- про структуру БД вже писав;
- якщо CREATE впаде з іншої причини - наприклад, через втрату зв'язку, то чи це буде оброблено коректно? До речі, мануал каже, що коли таблиця вже існує, то це буде ProgrammingError. Коментар не відповідає реальності, помилка обробляється косо-криво.
- deleted_table - це минулий час. Функція перевіряє, чи було таблицю видалено? Ні. Назва має відповідати дії. До речі, ви пишете то "юзер", то "таблиця". Визначиться з термінологією - або ви працюєте в термінах вашої програми (тоді "юзер"), або в термінах БД (тоді "таблиця"), або ви робите перехідник-адаптер з однієї термінології на іншу, тоді в назвах функцій має бути внутрішня термінологія програми, а всередині функцій - зовнішня термінологія БД.
- select_single - ви певні, що знаєте, що саме робить with? Вам точно треба закривати з'єднання після виконання цієї функції?
А ще ви в курсі, як працює for у Python? Що range - це костиль для перебору чисел, спеціально введений, щоб списки так не перебирали? Елементи data точно правильного розміру, може, варто було б передавати не tuple-и, а якісь структури з внутрішньої логіки? А якщо правильного, то нащо ви розбираєте data[number] на шматки, з яких збираєте новий tuple? Ваш код можна записати так:
for sample in data:
self.cursor.execute(f"INSERT INTO {self.table_name} Values(?,?,?,?,?,?,?,?)", sample)
і це - за умови, що return ви поставили неправильно, бо якщо правильно, то вам цикл взагалі не потрібен, він же лише один раз виконається.
Але це теж не дуже правильно, бо SQLite має також функцію executemany, що дозволяє взагалі уникнути циклу (точніше, вона сама містить цей цикл з додатковими оптимізаціями).
except IndexError & sqlite3.OperationalError:
Будь ласка, відкрийте підручник і прочитайте, що там написано. Або погугліть.