SQLite

SQLite - СУБД для создания реляционных баз данных. В Python SQLite является модулем, однако как и в модуле, так и в основном SQLite синтаксис команд остался таким же, за исключением того что в модуле python надо будет создать пару переменных и регулярно использовать их.

## Создание базы данных

Для начала импортируем библиотеку, после чего подключаемся к базе. Создаём в ней таблицу colors. Добавляем ей колонки HEX и RGB

**Совет: Что бы не допустить сложных ошибок, закрывайте курсор всегда**

```
import sqlite3
db = sqlite3.connect("new.db")
cursor = db.cursor()
cursor.execute('''CREATE TABLE colors (
 hex TEXT,
 rgb INTEGER
 )''')
cursor.close()

```

Столбцу hex мы указали текстовый вид данных, а rgb - числовой.

## Таблица типов SQLite

 TEXT
 INTEGER / INT
 REAL
 BLOB

## Операторы базы данных NOT NULL, AUTOINCREMENT и PRIMARY KEY

Операторы базы данных, это дополнительные параметры, которые назначаются таблицам и столбцам

Начнём с первого, NOT NULL. Если указать NOT NULL при создании базы данных(cм. пример ниже), и при вставлении данных в таблицу, оставить колонку пустой, дадут ошибку.

```
>>> import sqlite3
... db = sqlite3.connect("new.db")
... cur = db.cursor()
... cur.execute('''CREATE TABLE colors
 (HEX TEXT NOT NULL,
 RBG INTEGER NOT NULL);
 ''')
... cur.close()
>>> cur = db.cursor()
... cur.execute("INSERT INTO colors VALUES (?)", ("Цвет-Строка"))
... cur.close()
SQL Error [19]: [SQLITE\_CONSTRAINT]  Abort due to constraint violation (NOT NULL constraint failed: colors.RGB)

```
**ДОПОЛНИТЬ**

## Операторы манипуляции данными

### Таблицы с которой мы будем работать

```
cursor.execute('''CREATE TABLE users (
 name TEXT DEFAULT "Mr. Undefined",
 id INT NOT NULL,
 create\_date TEXT NOT NULL,
 about TEXT,
 xp INT DEFAULT 0,
 level INT DEFAULT 0
 )''')

cursor.execute('''CREATE TABLE pages (
 author\_id INT NOT NULL,
 page\_name TEXT DEFAULT "New Page",
 content TEXT NOT NULL
 )''')

```

### SELECT

Это оператор выбора элементов. Синтаксис "обычной команды": `SELECT [column/*] FROM [table]`. Звёздочка *(\*)* обозначает что выбирается всё из таблицы.

Чтобы получить данные из команды в Python нужно на конце команды написать .fetchone() или .fetchall() *( `cursor.execute("SELECT id FROM users").fetchone() )`*`.`

* `.fetchone()` возвращает кортеж. Используйте этот метод если вы уверены что из вашего запроса может быть лишь один вариант. Если нет, то используйте `.fetchall()`
* `.fetchall()` возвращает список из кортежей.

### WHERE

Это условие которое указывает какие условия должны выполняться при выборе. Синтаксис обычной команды SELECT с WHERE: `SELECT [column/*] FROM [table] WHERE [column_name] [operator] [value]`. Используется практически во всех операторах

### Примеры использования SELECT

```
for row in cursor.execute('SELECT id FROM users').fetchall():
    print(row)

if cursor.execute('SELECT \* FROM pages WHERE author\_id = 404').fetchone() is None:
    print("Такого пользователя не существует!")

user\_id = input("Введите ID пользователя: ")
user = cursor.execute('SELECT \* FROM users WHERE id = ?', (user\_id,)).fetchone()
print(user)

```

### INSERT

Этот оператор нужен для того чтобы чтобы вставлять данные в таблицу. Пример "обычной" команды: `INSERT INTO (table) VALUES (values);`

Однако можно вставить лишь в определённые столбцы. Для этого слева от `table` нужно будет написать в скобках столбцы через запятую и в `values` записать значения этих столбцов. Заполняться будут в том порядке, который был указан.

**Примечание:** При заполнении текстовых видов данных пишите значения в одинарных или двойных кавычках иначе выскочит ошибка!

**Примеры использования**

```
import random

name = input("Введите имя: ")
about = input("Введите что-то о себе: ")

# Если данный ID уже присутствует в таблице то регенерировать
while cursor.execute(f"SELECT \* FROM users WHERE id = {user\_id}").fetchone() is not None:
    id = random.randint(0, 10000)

cursor.execute(f"INSERT INTO users VALUES ('"{name}", {user\_id}, "{about}", 0, 1)')
db.commit()

```

### UPDATE

Этот оператор служит для обновления уже заполненных данных. При написании команды `UPDATE` обязательно пишите `WHERE`, иначе обновятся абсолютно все столбцы из таблицы! Синтаксис обычной команды: `UPDATE (table) SET (column) = (new_value) WHERE (column) (operator) (column_value)`

**Примечание:** При заполнении текстовых видов данных пишите значения в одинарных или двойных кавычках иначе выскочит ошибка!

**Примеры использования**

```

### DELETE *(доделать)*

Синтаксис обычной команды: `DELETE FROM (table) WHERE (column) (operator) (column_value)`

**Примеры использования**

```

## Интерполяция строк

Вместо использования интерполяции строк, надо использовать "?".

###### Пример использования

```
import sqlite3
db = sqlite3.connect("test.db")
cursor = db.cursor()
cursor.execute('''CREATE TABLE items (
 test TEXT,
 price REAL
 )''')
cursor.execute("INSERT INTO items VALUES (?, ?)", (test,price))
cursor.close()

```
В данном примере знаки вопроса заменятся на значение кортежа второго аргумента.

Это работает, потому что интерполяция строк в sqlite Запросах не безопасна.