Создание таблицы в SQLite с помощью Python достигается с помощью стандартного SQL-запроса CREATE TABLE
. Но прежде чем мы перейдем к этому, давайте рассмотрим базовые шаги по подключению к базе данных и созданию курсора для выполнения запросов.
import sqlite3
# Подключаемся к базе данных (если файла нет, он будет создан)
conn = sqlite3.connect('my_database.db')
# Создаем курсор для выполнения SQL-запросов
cursor = conn.cursor()
Рассмотрим пример создания таблицы users:
cursor.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
''')
В данном примере:
id
— это уникальный идентификатор для каждого пользователя, который автоматически инкрементируется.name
— это текстовое поле, которое не может быть NULL.age
— числовое поле для возраста пользователя.email
— текстовое поле для электронной почты, которое должно быть уникальным для каждого пользователя.SQLite — это уникальная реляционная база данных с упрощенной структурой типов данных по сравнению с большинством других баз данных, таких как MySQL или PostgreSQL. Рассмотрим основные типы данных и некоторые дополнительные параметры.
NULL
- Значение NULL
.INTEGER
- Целое число. Занимает от 1 до 8 байтов в зависимости от значения.REAL
- Число с плавающей запятой. Занимает 8 байтов.TEXT
- Строка текста. Хранится используя кодировку UTF-8, UTF-16BE или UTF-16LE.BLOB
- Двоичные данные. Хранится в том же формате, что и введен.SQLite использует динамическую типизацию, что означает, что вы можете сохранять любой тип данных в любом столбце, независимо от того, какой тип данных был задан при создании таблицы.
PRIMARY KEY
- Этот столбец становится уникальным идентификатором для строки. В SQLite столбец с типом INTEGER PRIMARY KEY
автоматически становится автоинкрементным.NOT NULL
- Столбец не может содержать значения NULL.UNIQUE
- Все значения в этом столбце должны быть уникальными.DEFAULT
- Значение по умолчанию для столбца.CHECK (expression)
- Ограничение, которое обеспечивает выполнение определенного условия для значений столбца.FOREIGN KEY
- Ссылка на другую таблицу. Используется для создания отношений между таблицами.AUTOINCREMENT
: Хотя в SQLite нет явного ключевого слова AUTOINCREMENT
как в некоторых других базах данных, столбец, определенный как INTEGER PRIMARY KEY
, автоматически будет автоинкрементным.WITHOUT ROWID
: По умолчанию каждая таблица в SQLite имеет специальный столбец ROWID
, который уникален для каждой строки. Однако, если вы хотите оптимизировать свою таблицу и избавиться от этого ROWID
(например, если у вас уже есть другой столбец, который действует как уникальный идентификатор), вы можете создать таблицу с ключевым словом WITHOUT ROWID
.Важно отметить, что из-за динамической типизации SQLite автоматически преобразует типы данных при необходимости, исходя из контекста операции. Например, если вы попытаетесь вставить текстовую строку в столбец, определенный как INTEGER
, SQLite попытается преобразовать эту строку в число. Если преобразование невозможно, значение сохраняется как текст.
Рассмотрим создание двух связанных таблиц - authors
и books
:
# Создание таблицы authors
cursor.execute('''
CREATE TABLE authors (
author_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
''')
# Создание таблицы books
cursor.execute('''
CREATE TABLE books (
book_id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author_id INTEGER,
FOREIGN KEY (author_id) REFERENCES authors(author_id)
)
''')
Здесь author_id
в таблице books
является внешним ключом, который ссылается на author_id
в таблице authors
.
После создания таблицы или выполнения любых других операций изменения, рекомендуется сохранить изменения, вызвав commit()
:
conn.commit()
И, конечно, не забудьте закрыть соединение:
conn.close()
В дополнение к уже представленной информации, стоит упомянуть несколько моментов:
Вы можете добавить ограничение CHECK
в таблицу для обеспечения выполнения определенного условия. Например, если вы хотите, чтобы возраст пользователя был больше 0 и меньше 150:
cursor.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER CHECK(age > 0 AND age < 150)
)
''')
Можно задать значение по умолчанию для столбца:
cursor.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER DEFAULT 18
)
''')
Теперь, если при вставке записи не указан возраст, он автоматически установится в 18.
Для ускорения операций поиска вы можете создавать индексы. Например, если вы часто ищете пользователей по их электронной почте:
cursor.execute("CREATE INDEX idx_email ON users(email)")
Всегда используйте параметризованные запросы (как показано в предыдущих примерах с "?"), чтобы избежать SQL-инъекций. Не формируйте запросы, вставляя переменные напрямую в строку SQL.
Вы можете проверить структуру вашей базы данных, используя следующий запрос:
cursor.execute("PRAGMA table_info(users)")
print(cursor.fetchall())
SQLite имеет некоторые ограничения в плане изменения структуры таблицы после ее создания. Например, вы не можете удалить или переименовать столбцы без создания новой таблицы. Но вы можете добавлять новые столбцы или создавать новые индексы.
После удаления большого количества данных, база данных SQLite может занимать больше места на диске, чем требуется. Чтобы освободить это место, используйте команду VACUUM
:
cursor.execute("VACUUM")
Создание таблиц — это основа работы с реляционной базой данных, и понимание основных типов данных и параметров SQLite позволит создавать структурированные и оптимизированные таблицы для различных нужд. Важно помнить о безопасности и избегать потенциальных SQL-инъекций, используя параметризованные запросы.
SQLite, будучи легковесной и встраиваемой базой данных, идеально подходит для многих задач, начиная от простых локальных приложений и заканчивая сложными системами с потоками данных.
Содержание: