База данных представляет собой организованный набор данных, доступ к которым осуществляется через компьютер. Возникнув как стандартный язык для систем управления реляционными базами данных, операторы используются для управления или извлечения данных из базы данных.
Для целей этого сообщения в блоге мы рассмотрим базу данных только с одной таблицей. Например, как тот, что ниже.
В этом примере таблицы мы назовем «Собаки», первичный ключ (или уникальный идентификатор для каждой записи) — самый левый столбец. Здесь столбцы: «имя», «порода», «возраст» и «owner_id». Каждая строка этой таблицы может называться записью. Вы также заметите, что owner_id также является числом. Хотя мы сосредоточимся только на одной таблице Dogs, в случае реляционной базы данных с дополнительными таблицами внешний ключ — в данном случае owner_id — относится к первичному ключ в другой таблице (например, в гипотетической таблице Владельцы).
Теперь, когда это не так, давайте рассмотрим основные ключевые слова SQL, которые обычно используются для основных запросов CRUD.
- ( *) : этот символ обозначает «все».
- FROM: указывает таблицу, из которой запрашиваются данные.
- ГДЕ: указывает условный выбор данных.
- ORDER BY:определяет любую условную сортировку, которую необходимо выполнить.
Читать // ВЫБРАТЬ
SELECT используется для чтения данных. Базовый шаблон выглядит так:
SELECT {column names or *} FROM {table name} WHERE {any conditionals} ORDER BY {sorting conditionals}
Запросы SELECT для нашей таблицы Собаки:
SELECT * FROM Dogs; // returns all records within the Dogs table SELECT name FROM Dogs WHERE breed="Golden" // returns one record, Dino
Создать // ВСТАВИТЬ
INSERT используется для вставки/добавления новых данных.
INSERT {table name} (column-names) VALUES (column-values)
Что может выглядеть так:
INSERT Dogs (name, breed, age, owner_id) VALUES ("Bruiser", "French Bulldog", 1, 1); // Create a new record with the name Bruiser, breed as french bulldog, age 1, and owner_id = 1
Обновление // ОБНОВЛЕНИЕ
Обновляет существующие данные. Общий синтаксис:
UPDATE {table name} SET {column name} = {column value} WHERE {condition}
В нашей таблице собак:
UPDATE Dogs SET owner_id = 3 WHERE id = 10; // Update the Dogs table at primary key id 10, and set the owner_id to 3
Уничтожить // УДАЛИТЬ
Удаляет данные. Обычно пишут:
DELETE {table name} WHERE {some condition}
Переводит на:
DELETE Dogs WHERE age > 5; // Delete records in Dogs if the age specified is larger than 5
Введите ActiveRecord и Rails
Изучив основы SQL, мы можем посмотреть, как Rails и SQL работают вместе через Active Record. ActiveRecord — это класс в Ruby, который используется для сопоставления классов и их атрибутов с таблицами в базе данных. В стандартной базе данных у нас есть таблицы, столбцы и строки. В Rails у нас есть модели (классы) и объекты.
ActiveRecord выполняет те же SQL-запросы и абстрагирует методы в приятные простые методы класса. Если вы хотите освежить свои SQL-запросы или вам интересно узнать, что ActiveRecord запускает в фоновом режиме, воспользуйтесь ActiveRecord Logger!
Запросы на Rails
С абстрактным синтаксисом SQL ниже приведены некоторые типичные методы ActiveRecord:
.all — получить все объекты из определенной модели.
Dogs.all // returns all records from the Dogs table
В фоновом режиме выполняется тот же SQL-запрос SELECT & FROM dogs
.find — получить объект по его идентификатору / первичному ключу
Dogs.find(3) // returns the record from the Dog table with id=3
Который работает SELECT * FROM dogs WHERE id = 3
.where — получить объекты, удовлетворяющие условиям
Dogs.where(breed: "Pitbull")
Это то же самое, что SELECT * FROM dogs WHERE breed = "Pitbull"
в SQL.
Почему SQL?
Поскольку Rails и ActiveRecord заботятся о создании/манипулировании и запросе нашей базы данных, то почему мы должны заботиться о SQL? Хотя это здорово (и намного проще), что ActiveRecord абстрагируется от запросов, существует некоторый разрыв между фактическим пониманием запроса, который выполняется в фоновом режиме. В целях отладки, а также для общего понимания и освоения Rails рекомендуется сначала подойти к проблеме запроса в терминах SQL, а затем определить, какие методы ActiveRecord могут обеспечить решение.