Таблицы SQL из Python: варианты реализации

Раздел: Базы данных -> Работа с базами данных

Основные способы создания таблиц в SQL через Python

Как создать таблицу в SQLite с помощью модуля sqlite3?

Наиболее эффективное решение для быстрого прототипирования - использование встроенного модуля sqlite3. Этот подход не требует установки дополнительного сервера и идеально подходит для локальных приложений, тестирования или небольших проектов.


import sqlite3

# Подключение к базе данных (файл example.db)
conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# Создание таблицы users
cursor.execute('''
    CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT UNIQUE
    )
''')

# Сохранение изменений и закрытие
conn.commit()
conn.close()
  

создание базы данных на python (создание базы данных с помощью python)

Пояснение шагов:

  • connect - устанавливает соединение с файлом БД (если файла нет, он будет создан).
  • cursor - объект для выполнения SQL-команд.
  • execute - выполнение команды CREATE TABLE.
  • commit - фиксация изменений.
  • close - закрытие соединения.

Типичная ошибка: таблица уже существует

Если таблица users уже есть, выполнение кода вызовет исключение sqlite3.OperationalError: table users already exists. Решение - использовать конструкцию IF NOT EXISTS:


cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT UNIQUE
    )
''')
    

база данных на python (база данных на python)

Как создать таблицу в PostgreSQL через psycopg2?

Для работы с PostgreSQL требуется установленный драйвер psycopg2. Этот вариант используется в продакшен-средах, где нужна высокая производительность и поддержка транзакций.


import psycopg2

conn = psycopg2.connect(
    dbname="testdb",
    user="postgres",
    password="secret",
    host="localhost",
    port="5432"
)
cursor = conn.cursor()

cursor.execute('''
    CREATE TABLE IF NOT EXISTS products (
        id SERIAL PRIMARY KEY,
        title VARCHAR(100) NOT NULL,
        price NUMERIC(10,2) DEFAULT 0.00,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
''')

conn.commit()
cursor.close()
conn.close()
  

Python интерфейс базы данных (интерфейс базы данных в python)

Пояснение: тип SERIAL автоматически создаёт последовательность для первичного ключа. NUMERIC(10,2) - десятичное число с двумя знаками после запятой.

Ошибка подключения

При неправильных параметрах подключения возникает psycopg2.OperationalError. Необходимо проверить имя БД, пользователя, пароль и доступность сервера.

Как создать таблицу в MySQL через PyMySQL?

Для MySQL популярен модуль PyMySQL или mysql-connector-python. Пример с PyMySQL:


import pymysql

conn = pymysql.connect(
    host='localhost',
    user='root',
    password='12345',
    database='mydb',
    charset='utf8mb4'
)
cursor = conn.cursor()

cursor.execute('''
    CREATE TABLE IF NOT EXISTS orders (
        id INT AUTO_INCREMENT PRIMARY KEY,
        customer_id INT NOT NULL,
        total DECIMAL(10,2),
        order_date DATE
    )
''')

conn.commit()
conn.close()
  

Fastapi python postgresql (работа с postgresql в fastapi)

Важно: charset='utf8mb4' обеспечивает корректную работу с Unicode (эмодзи, редкие символы).

Проблема с кодировкой

Если не указать кодировку, строки с кириллицей могут сохраниться некорректно. Всегда используйте utf8mb4 для MySQL.

Как создать таблицу с помощью SQLAlchemy ORM?

SQLAlchemy - это ORM, которая позволяет работать с таблицами как с классами Python. Такой подход упрощает поддержку и переносимость между разными СУБД.


from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///mydb.sqlite', echo=True)
Base = declarative_base()

class Employee(Base):
    __tablename__ = 'employees'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    salary = Column(Float)

# Создание всех таблиц
Base.metadata.create_all(engine)
  

таблица sql python (создание таблиц в sql через python)

Пояснение: класс Employee соответствует таблице employees. Метод create_all генерирует CREATE TABLE на основе метаданных. Параметр echo=True выводит SQL-запросы в консоль.

Ошибка: несоответствие типов

При использовании ORM важно правильно задать типы колонок. Например, String без длины может привести к предупреждению. В PostgreSQL для String требуется указать длину (например, String(100)).

Как создать временную таблицу?

Временные таблицы существуют только в рамках текущего соединения и автоматически удаляются при его закрытии. В SQLite для этого используется ключевое слово TEMPORARY:


cursor.execute('''
    CREATE TEMPORARY TABLE temp_logs (
        id INTEGER,
        message TEXT
    )
''')
  

подключение к бд python (подключение к базе данных в python)

В PostgreSQL и MySQL синтаксис аналогичен: CREATE TEMPORARY TABLE temp_logs (...).

Как создать таблицу с внешними ключами?

Внешние ключи обеспечивают ссылочную целостность. Пример для SQLite (необходимо включить поддержку foreign keys):


cursor.execute('PRAGMA foreign_keys = ON')
cursor.execute('''
    CREATE TABLE IF NOT EXISTS departments (
        id INTEGER PRIMARY KEY,
        name TEXT
    )
''')
cursor.execute('''
    CREATE TABLE IF NOT EXISTS employees (
        id INTEGER PRIMARY KEY,
        name TEXT,
        dept_id INTEGER,
        FOREIGN KEY (dept_id) REFERENCES departments(id)
    )
''')
  

Ошибка: внешний ключ не срабатывает

В SQLite по умолчанию внешние ключи игнорируются. Команда PRAGMA foreign_keys = ON должна выполняться при каждом новом соединении.

Расширенные примеры создания таблиц

Пример 1. Создание таблицы с использованием параметризации для динамического имени

В некоторых случаях имя таблицы подставляется динамически. Важно: используйте безопасную интерполяцию через format только для имён таблиц/колонок (данные - через параметры).

Пример

def create_table(table_name, columns):
    columns_def = ', '.join([f'{col} {dtype}' for col, dtype in columns.items()])
    query = f"""
        CREATE TABLE IF NOT EXISTS {table_name} (
            {columns_def}
        )
    """
    cursor.execute(query)

# Использование
columns = {
    'id': 'INTEGER PRIMARY KEY',
    'username': 'TEXT UNIQUE NOT NULL',
    'created': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'
}
create_table('accounts', columns)
  
# Результат: создана таблица accounts с тремя колонками
  

Пояснение: функция принимает словарь, где ключи - имена колонок, значения - типы. Затем формируется строка с определениями колонок.

Пример 2. Создание таблицы с составным первичным ключом

Составной первичный ключ (composite primary key) полезен для таблиц-связей «многие ко многим».

Пример

cursor.execute('''
    CREATE TABLE IF NOT EXISTS enrollment (
        student_id INTEGER NOT NULL,
        course_id INTEGER NOT NULL,
        enrollment_date DATE,
        PRIMARY KEY (student_id, course_id)
    )
''')
  
# Таблица enrollment имеет составной первичный ключ из student_id и course_id
  

Пример 3. Создание таблицы с индексами и уникальными ограничениями

Индексы ускоряют поиск, но замедляют вставку. Создание индекса после таблицы:

Пример

cursor.execute('''
    CREATE TABLE IF NOT EXISTS products (
        id INTEGER PRIMARY KEY,
        name TEXT,
        sku TEXT UNIQUE,
        category_id INTEGER
    )
''')
cursor.execute('''
    CREATE INDEX IF NOT EXISTS idx_products_category
    ON products (category_id)
''')
  
# Создана таблица products и индекс для category_id. SKU уже уникален по определению.
  

Пример 4. Создание таблицы с наследованием в PostgreSQL

PostgreSQL поддерживает наследование таблиц. Например, таблица person и таблица employee, наследуемая от неё.

Пример

cursor.execute('''
    CREATE TABLE IF NOT EXISTS person (
        id SERIAL PRIMARY KEY,
        name TEXT NOT NULL,
        birthdate DATE
    )
''')
cursor.execute('''
    CREATE TABLE IF NOT EXISTS employee (
        salary NUMERIC(10,2),
        hire_date DATE
    ) INHERITS (person)
''')
  
# Employee содержит все колонки person плюс salary и hire_date.
# Запросы к person могут включать данные из employee (если не указано ONLY).
  

Пример 5. Создание таблицы с помощью контекстного менеджера (with)

Контекстный менеджер автоматически закрывает соединение и откатывает изменения при ошибке.

Пример

import sqlite3

with sqlite3.connect('test.db') as conn:
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS logs (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            event TEXT,
            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
        )
    ''')
    conn.commit()
  
# После выхода из блока with соединение закрывается автоматически.
  

Создание таблиц в SQL через Python - comments

En
таблица sql python (python)