Как создать таблицу в базе данных при помощи Python

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

Создание таблицы в базе данных через Python

Наиболее эффективное решение для создания таблицы в Python предполагает использование встроенной библиотеки sqlite3 для SQLite и пакета psycopg2 для PostgreSQL. Такой подход даёт полный контроль над SQL-синтаксисом и минимальные накладные расходы.

Пример для SQLite:


import sqlite3

conn = sqlite3.connect('shop.db')
cursor = conn.cursor()
cursor.execute('''
    CREATE TABLE IF NOT EXISTS products (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        price REAL NOT NULL DEFAULT 0.0,
        created_at TEXT DEFAULT (datetime('now'))
    )
''')
conn.commit()
conn.close()
  

Sql server python (sql server и python)

Для PostgreSQL аналогичный код потребует установленного psycopg2:


import psycopg2

conn = psycopg2.connect(
    host='localhost',
    dbname='store',
    user='admin',
    password='secret'
)
cursor = conn.cursor()
cursor.execute('''
    CREATE TABLE IF NOT EXISTS products (
        id SERIAL PRIMARY KEY,
        name VARCHAR(200) NOT NULL,
        price NUMERIC(10,2) NOT NULL DEFAULT 0.00,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
''')
conn.commit()
conn.close()
  

Sql через python (работа с sql через python)

Типичные ошибки:

  • Забытый вызов conn.commit() - таблица не сохраняется.
  • Несоответствие типов данных: в SQLite INTEGER PRIMARY KEY даёт автоинкремент, но без AUTOINCREMENT поведение отличается. В PostgreSQL используется SERIAL.
  • Ошибка подключения к PostgreSQL: неверный хост, порт, или отсутствие прав.
  • Имя таблицы совпадает с зарезервированным словом (например, user, order) - нужно оборачивать в кавычки или использовать другое имя.

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

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


import sqlite3

conn = sqlite3.connect('school.db')
cursor = conn.cursor()
cursor.execute('PRAGMA foreign_keys = ON')
cursor.execute('''
    CREATE TABLE students (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        group_id INTEGER,
        FOREIGN KEY (group_id) REFERENCES groups(id)
    )
''')
conn.commit()
conn.close()
  

Python postgresql (подключение к postgresql из python)

Если не включить PRAGMA, ограничение внешнего ключа не будет проверяться. Это частая причина неожиданного поведения.

Как создать таблицу через ORM (SQLAlchemy)?

SQLAlchemy позволяет описать таблицу в виде класса Python. Это удобно для больших проектов с миграциями.


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

Base = declarative_base()

class Product(Base):
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100), nullable=False)
    price = Column(Float, default=0.0)

engine = create_engine('sqlite:///shop_orm.db')
Base.metadata.create_all(engine)
  

Python база данных таблицу (создание таблицы в базе данных python)

Для PostgreSQL строка подключения меняется на postgresql://user:pass@localhost/dbname. При использовании ORM не нужно писать SQL вручную.

Ошибка: необходимо установить sqlalchemy и драйвер (например, psycopg2-binary). Также важно правильно определить типы колонок (например, Float может дать неточности для денег, лучше использовать Numeric).

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

Временные таблицы существуют только в рамках сессии. В SQLite:


import sqlite3
conn = sqlite3.connect(':memory:')  # или обычная БД
cursor = conn.cursor()
cursor.execute('''
    CREATE TEMPORARY TABLE temp_data (
        id INTEGER,
        value TEXT
    )
''')
  

библиотека sql python (библиотека для работы с sql в python)

В PostgreSQL синтаксис аналогичен, но таблица исчезает после закрытия соединения или завершения транзакции (если указано ON COMMIT DROP).

Временные таблицы не видны из других подключений. Если попытаться обратиться к ним после пересоздания соединения, возникнет ошибка no such table.

Как создать таблицу с индексами и ограничениями?

Индексы ускоряют поиск. Их можно создать сразу при создании таблицы или отдельно. Пример для PostgreSQL с уникальным индексом на email:


import psycopg2

conn = psycopg2.connect('dbname=test')
cursor = conn.cursor()
cursor.execute('''
    CREATE TABLE users (
        id SERIAL PRIMARY KEY,
        email VARCHAR(255) NOT NULL,
        username VARCHAR(50) NOT NULL,
        CONSTRAINT uq_email UNIQUE (email)
    )
''')
cursor.execute('CREATE INDEX idx_username ON users (username)')
conn.commit()
conn.close()
  

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

Ограничения CHECK можно использовать для проверки значений:


cursor.execute('''
    CREATE TABLE orders (
        id SERIAL PRIMARY KEY,
        quantity INTEGER CHECK (quantity > 0),
        price NUMERIC CHECK (price >= 0)
    )
''')
  

Ошибка: при вставке недопустимых значений срабатывает исключение IntegrityError или CheckViolation. Нужно обрабатывать такие ситуации в коде.

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

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

PostgreSQL поддерживает нативный JSON. Это удобно для хранения гибких данных:

Пример

import psycopg2

conn = psycopg2.connect('dbname=test')
cursor = conn.cursor()
cursor.execute('''
    CREATE TABLE logs (
        id SERIAL PRIMARY KEY,
        event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        payload JSONB NOT NULL
    )
''')
conn.commit()
cursor.execute("INSERT INTO logs (payload) VALUES ('{"action": "login", "user": 42}'::jsonb)")
cursor.execute('SELECT * FROM logs')
print(cursor.fetchall())
conn.close()
[(1, datetime.datetime(2025, 3, 24, 12, 0, 0), {'action': 'login', 'user': 42})]

Пояснение:

Тип JSONB позволяет индексировать и эффективно искать внутри JSON. В SQLite тоже есть JSON-функции, но отдельного типа нет, используется TEXT.

Пример 2. Таблица с наследованием в PostgreSQL

Наследование таблиц удобно при реализации общих полей:

Пример

cursor.execute('''
    CREATE TABLE person (
        id SERIAL PRIMARY KEY,
        name TEXT NOT NULL,
        age INTEGER
    )
''')
cursor.execute('''
    CREATE TABLE employee (
        salary NUMERIC,
        department TEXT
    ) INHERITS (person)
''')
cursor.execute("INSERT INTO employee (name, age, salary, department) VALUES ('Alice', 30, 70000, 'IT')")
cursor.execute('SELECT * FROM only person')  -- только person
cursor.execute('SELECT * FROM employee')     -- все поля person + employee
conn.commit()
# Строк из employee, но не из person
(1, 'Alice', 30, 70000.0, 'IT')

Пояснение:

Наследование создаёт неявные связи. Таблица-потомок содержит все столбцы родителя. Запрос к родителю не видит строки потомка (если не использовать ONLY). Наследование редко применяется, так как усложняет работу с внешними ключами.

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

Можно использовать триггер для автоматического обновления updated_at:

Пример

cursor.execute('''
    CREATE TABLE articles (
        id SERIAL PRIMARY KEY,
        title TEXT NOT NULL,
        content TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
''')
cursor.execute('''
    CREATE OR REPLACE FUNCTION update_updated_at()
    RETURNS TRIGGER AS $$
    BEGIN
        NEW.updated_at = CURRENT_TIMESTAMP;
        RETURN NEW;
    END;
    $$ LANGUAGE plpgsql
''')
cursor.execute('''
    CREATE TRIGGER trg_articles_updated
    BEFORE UPDATE ON articles
    FOR EACH ROW EXECUTE FUNCTION update_updated_at()
''')
conn.commit()

Пояснение:

В SQLite можно использовать DEFAULT с datetime('now'), но автоматическое обновление при изменении строки требует триггера.

Пример 4. Создание таблицы из Pandas DataFrame (SQLite)

Pandas упрощает перенос данных, но не всегда создаёт оптимальные типы:

Пример

import pandas as pd
import sqlite3

df = pd.DataFrame({
    'product': ['A', 'B'],
    'price': [100, 200]
})
conn = sqlite3.connect('pandas_example.db')
df.to_sql('products', conn, if_exists='replace', index=False)
cursor = conn.cursor()
cursor.execute('SELECT * FROM products')
print(cursor.fetchall())
conn.close()
[('A', 100.0), ('B', 200.0)]

Пояснение:

Метод to_sql автоматически создаёт таблицу и определяет типы столбцов на основе типов Pandas. Для тонкой настройки типов лучше использовать sqlalchemy или сырой SQL.

Пример 5. Создание таблицы с полнотекстовым поиском (FTS) в SQLite

SQLite поддерживает виртуальные таблицы FTS5 для быстрого поиска:

Пример

import sqlite3

conn = sqlite3.connect('fts_example.db')
cursor = conn.cursor()
cursor.execute('''
    CREATE VIRTUAL TABLE documents USING fts5(title, content)
''')
cursor.execute("INSERT INTO documents VALUES ('Python SQL', 'Learning SQL with Python')")
cursor.execute("SELECT * FROM documents WHERE documents MATCH 'SQL'")
print(cursor.fetchall())
conn.close()
[(1, 'Python SQL', 'Learning SQL with Python')]

Пояснение:

FTS5 создаёт инвертированный индекс. Можно использовать оператор MATCH. В PostgreSQL для полнотекстового поиска применяются типы tsvector и tsquery.

Создание таблицы в базе данных Python - comments

En
Python база данных таблицу (python)