Комментарии (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
| DML | DDL |
|---|---|
| INSERT, SELECT, UPDATE, DELETE | CREATE, 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 невозможна никакая работа с данными. Это не техническая деталь, а центральная часть архитектуры любого приложения.