← Назад к вопросам

Зачем нужен DML в БД?

1.6 Junior🔥 141 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужен DML в базах данных

DML (Data Manipulation Language) — это набор команд для работы с **данными**, а не со схемой БД. Это основной способ, как приложения взаимодействуют с БД.

Что входит в DML

Четыре основные команды:

-- INSERT — добавление данных
INSERT INTO users (name, email) VALUES ('John', 'john@example.com');

-- SELECT — получение данных
SELECT * FROM users WHERE id = 1;

-- UPDATE — изменение данных
UPDATE users SET name = 'Jane' WHERE id = 1;

-- DELETE — удаление данных
DELETE FROM users WHERE id = 1;

Это противоположность DDL (CREATE TABLE, ALTER TABLE, DROP TABLE), которая работает со схемой.

Зачем нужен DML

1. Основной канал коммуникации между приложением и БД

from sqlalchemy import select
from database import engine, users

# DML: SELECT
query = select(users).where(users.c.id == 1)
with engine.connect() as conn:
    result = conn.execute(query)
    user = result.fetchone()

2. CRUD операции

# CREATE
insert_query = users.insert().values(name='John', email='john@example.com')

# READ
select_query = select(users).where(users.c.id == 1)

# UPDATE
update_query = users.update().where(users.c.id == 1).values(name='Jane')

# DELETE
delete_query = users.delete().where(users.c.id == 1)

3. Транзакции и консистентность

BEGIN TRANSACTION;
INSERT INTO accounts (user_id, balance) VALUES (1, 1000);
INSERT INTO transactions (from_account, to_account, amount) VALUES (1, 2, 100);
COMMIT;  -- Либо всё применится, либо ничего (ACID)

4. Сложные запросы и аналитика

-- Агрегация
SELECT user_id, COUNT(*) as post_count 
FROM posts 
GROUP BY user_id;

-- JOIN
SELECT u.name, p.title 
FROM users u 
JOIN posts p ON u.id = p.user_id;

-- Фильтрация
SELECT * FROM orders WHERE created_at > NOW() - INTERVAL 30 DAY;

DML vs DDL

DMLDDL
INSERT, SELECT, UPDATE, DELETECREATE, ALTER, DROP, TRUNCATE
Работает с даннымиРаботает со схемой
Часто используетсяРедко (только при разработке)
Обратимо (откатывается)Нужны миграции
Применяется в приложенииПрименяется при развёртывании

DML в Python

SQLAlchemy (ORM)

from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session

engine = create_engine('postgresql://user:pass@localhost/db')

# INSERT
with Session(engine) as session:
    user = User(name='John', email='john@example.com')
    session.add(user)
    session.commit()

# SELECT
with Session(engine) as session:
    user = session.query(User).filter(User.id == 1).first()

# UPDATE
with Session(engine) as session:
    user = session.query(User).filter(User.id == 1).first()
    user.name = 'Jane'
    session.commit()

# DELETE
with Session(engine) as session:
    user = session.query(User).filter(User.id == 1).first()
    session.delete(user)
    session.commit()

Raw SQL

import psycopg2

conn = psycopg2.connect('dbname=mydb user=postgres')
cur = conn.cursor()

# DML
cur.execute('INSERT INTO users (name) VALUES (%s)', ('John',))
cur.execute('SELECT * FROM users WHERE id = %s', (1,))
cur.execute('UPDATE users SET name = %s WHERE id = %s', ('Jane', 1))
cur.execute('DELETE FROM users WHERE id = %s', (1,))

conn.commit()

Когда нужен DML

В приложении:

  • Получение данных пользователя
  • Сохранение заказов
  • Обновление профиля
  • Удаление комментариев

В скриптах обслуживания:

  • Очистка устаревших логов
  • Импорт данных из другого источника
  • Экспорт отчётов
  • Миграция данных

Производительность DML

# ❌ Медленно — N+1 queries
for user_id in user_ids:
    # DML запрос в цикле
    user = session.query(User).filter(User.id == user_id).first()

# ✅ Быстро — один запрос
users = session.query(User).filter(User.id.in_(user_ids)).all()

Безопасность DML

# ❌ SQL injection
query = f"SELECT * FROM users WHERE name = '{name}'"

# ✅ Параметризованные запросы
query = "SELECT * FROM users WHERE name = %s"
cur.execute(query, (name,))

Вывод: DML — это основной язык взаимодействия приложений с БД. Без DML невозможна никакая работа с данными. Это не техническая деталь, а центральная часть архитектуры любого приложения.