SQ-Snip - сниппет для лёгкой работы с SQlite3

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
lua / python developer
Редактор
Регистрация
13 Июн 2022
Сообщения
71
Всем привет. Написал сниппет для лёгкой работы с запросами в БД SQlite3. Лично я считаю, что данный сниппет делает код лучше и намного привлекательнее.

Важно. Сниппет не использует абсолютно все методы SQlite3, а только самые важные. Для полноценного использования лучше импортировать SQlite3.


Python:
import sqlite3

def select_elements(
        table: list,
        where_state: bool = False
    ):
    result = ""
    if type(table) == list:
        params = [len(table), 0]
        for el in table:
            if type(el) == dict:
                if len(el) > 1:
                    for i in el:
                        el[i] = f"\"{el[i]}\"" if type(el[i]) == str else str(el[i])
                        res = ", " if not where_state else " AND "
                        result += str(i) + " = " + el[i] + ("" if params[1] == params[0] else res)
                        params[1] += 1
                else:
                    params[1] += 1
                    for i in el:
                        el[i] = f"\"{el[i]}\"" if type(el[i]) == str else str(el[i])
                        res = ", " if not where_state else " AND "
                        result += str(i) + " = " + el[i] + ("" if params[1] == params[0] else res)
            else:
                params[1] += 1
                res = ", " if not where_state else " AND "
                result += str(el) + ("" if params[1] == params[0] else res)
    elif type(table) == str:
        result = table
    elif type(table) == dict:
        params = [len(table), 0]
        for el in table:
            params[1] += 1
            table[el] = f"\"{table[el]}\"" if type(table[el]) == str else str(table[el])
            res = ", " if not where_state else " AND "
            result += str(el) + " = " + table[el] + ("" if params[1] == params[0] else res)
    return result

class database:
    def __init__(
            self,
            db_name: str,
            db_table: str,
            db_values: str
        ):
        self.db = sqlite3.connect(db_name)
        self.sql = self.db.cursor()
        self.table = db_table

        self.sql.execute(f"""CREATE TABLE IF NOT EXISTS {db_table}({db_values})""")
        self.db.commit()

    def select(self, need: list[dict] | str, where: str | dict | list[dict], all_state = False) -> dict | None:
        result = ["", ""]
       
        if type(need) == str:
            result[0] = need
        elif type(need) == list:
            params = [len(need), 0]
            for el in need:
                params[1] += 1
                result[0] += str(el) + ("" if params[1] == params[0] else ", ")

        result[1] = select_elements(where, True)

        print(result[1])
        self.sql.execute(f"SELECT {result[0]} FROM {self.table} WHERE {result[1]}")
        result = self.sql.fetchone() if not all_state else self.sql.fetchall()

        if result and len(result) == 0:
            return None
       
        return result
   
    def insert(self, values: list | tuple | dict):
        if type(values) == list or dict:
            values = tuple(values)
       
        keys = "("
        for i in range(len(values)):
            if i != (len(values) - 1):
                keys += "?,"
            else:
                keys += "?)"
        self.sql.execute(f"INSERT INTO {self.table} VALUES {keys}", values)
        self.db.commit()

    def update(self, keys: str | dict | list[dict],  where: str | dict | list[dict]):
        result = ["", ""]

        result[0] = select_elements(keys)
        result[1] = select_elements(where, True)

   
        self.sql.execute(f"UPDATE {self.table} SET {result[0]} WHERE {result[1]}")
        self.db.commit()

    def delete(self, where: str | dict | list[dict]):
        result = select_elements(where, True)

        self.sql.execute(f"DELETE FROM {self.table} WHERE {result}")
        self.db.commit()

    def close(self):
        self.db.close()

self.select(need: str | list, where: str | list[dict] | dict, all_state: bool)
  • need: str - То, что требуется достать из БД. Можно указать "*"
  • where: str - Условие. Можно указать ключ-идентификатор
  • all_state: bool - В случае true вернёт fetchall(), в ином случае fetchone()
Пример: self.select("*", "", True)
self.insert(values: tuple | list[int|str|bool] | dict)
  • values: tuple | list | dict - Значения, которые нужно вставить.
Пример: self.insert([1,2,3])
Учтите, что количество элементов в tuple, должно быть равно количеству столбцов в таблице.​
В случае использования словаря, будут передаваться только ключи.​
self.update(keys: str | list[dict] | dict, where: str | list[dict] | dict)
  • keys: str | list | dict - Что требуется изменить
  • where: str | list | dict - Условие. Можно указать ключ-идентификатор
Пример: self.update({"status": 1, "rid": 1}, {"id": 1"})
self.close()
Отправляет self.db.close()​
self.delete(where: str | list[dict] | dict)
  • where: str | list | dict - Условие. Можно указать ключ-идентификатор
Пример: self.delete({"id": 1})



Python:
from sqsnip import database

db = database("test.db", "users", """
    id INTEGER,
    status INTEGER,
    param INTEGER
""")

db.insert([1,2]) # db.insert((1,2)) | db.insert({1:1, 2:2})
result = db.select("*", {"id": 1}, True)
print(result)

db.update({"status": 10, "param": 11}, {"id": 1})

result = db.select("*", {"id": 1}, True)
print(result)

db.close()

В функции self.select(need: list[dict] | str, where: str | dict | list[dict], all_state = False) передаётся параметр all_state , он и отвечает за вид функции.

1. Для начала создадим подобие базы данных.
1704044489803.png

2. Сравним результаты с помощью:
[/CENTER] result = db.select(["awards", "id"], {"id": 1, "awards": "За особый вклад в науке об огурцах"}, True | False) [CENTER]

1704044560210.png
1704044589272.png


 

Вложения

  • sqsnip.py
    3.6 KB · Просмотры: 1
Последнее редактирование:
lua / python developer
Редактор
Регистрация
13 Июн 2022
Сообщения
71
  • Добавил возможность использования других типов данных в self.insert() ( Теперь можно использовать list[int|str|bool], dict и сам tuple )
    Пример:
    self.insert([1,2,3]) # Случай использования list
    self.insert({1:1, 2:2, 3:3}) # В этом случае будут занесены только ключи
    self.insert((1,2,3)) # Стандартный случай
 
lua / python developer
Редактор
Регистрация
13 Июн 2022
Сообщения
71
  • Исправил ошибку с несколькими условиями( фильтрами ) WHERE
  • Добавил спойлер с отличиями fetchall() от fetchone()
.Все готовят салаты, а я обновляю сниппет.
 
lua / python developer
Редактор
Регистрация
13 Июн 2022
Сообщения
71
  • Новая функция - self.delete(where: str | list[dict] | dict)
    Суть функции - удаление ячейки из таблицы по фильтру.
    Принимает в себя аргумент WHERE, тобишь фильтр, какую ячейку нужно удалить.
    Пример:
    Python:
    from sqsnip import database
    db = database("test.db", "users" """
        id INTEGER
    """)
    
    db.insert([1]) # Добавляем новую запись(ячейку) в таблицу
    
    db.delete({"id": 1}) # Удаляем запись(ячейку) с фильтром id == 1
 
Сверху