Sepanjang section ini kita mengetik statement satu per satu dan langsung melihat hasilnya di layar. Pola kerja tersebut nyaman untuk bereksperimen, tetapi tidak ramah untuk dikumpulkan: statement yang pernah kita ketik hanya tersimpan di riwayat sesi, mudah hilang, dan tidak bisa dijalankan ulang secara teratur. Solusinya adalah menuangkan latihan menjadi file .sql yang tersimpan rapi di folder proyek, persis seperti programmer menyimpan kode programnya. Pada chapter penutup section ini kita menyusun konvensi folder latihan yang akan dipakai sepanjang course, membedah anatomi sebuah file skema, lalu menjalankan file tersebut dari terminal dengan mode batch.

Dari Sesi Interaktif ke File Proyek #

MySQL tidak mengenal konsep proyek — server hanya menerima statement demi statement dan tidak peduli dari mana statement itu berasal. Struktur folder dan file .sql murni konvensi kita sebagai pengguna, dan konvensi itulah yang membuat pekerjaan SQL bisa dikelola layaknya kode program biasa. Tiga manfaatnya konkret bagi cara kita belajar:

  • Dapat dijalankan ulang — seluruh skema dan data contoh dibangun kembali kapan pun dengan satu perintah, sehingga kita selalu bisa kembali ke titik awal yang bersih.
  • Dapat dibaca ulang — file teks bisa dibedah, dikomentari, dan ditinjau sebelum dijalankan, jauh lebih nyaman daripada menggulung riwayat sesi.
  • Dapat dibandingkan — perubahan antar versi file terlihat jelas baris per baris, cocok untuk version control seperti Git.

File .sql sendiri hanyalah file teks biasa berisi statement SQL yang dieksekusi berurutan dari baris atas ke baris bawah. Format yang sama dipakai mysqldump untuk membuat backup dan oleh alat migrasi database di dunia kerja, jadi kebiasaan yang kita bangun sekarang akan terus terpakai jauh ke depan.

Konvensi Folder Latihan #

Kita memakai satu folder proyek per kelompok latihan, misalnya proyek-toko untuk semua latihan seputar database toko. Di dalamnya, tiga subfolder memisahkan tiga jenis file yang perannya berbeda:

text
proyek-toko/
├── sql/
│   ├── 01-skema.sql
│   └── 02-data-awal.sql
├── data/
│   └── cadangan-toko.sql
└── tests/
    └── uji-produk.sql

Folder sql/ menampung file yang membangun isi database: membuat database, membuat tabel, dan mengisi data contoh — file inilah yang kita jalankan lewat mode batch. Folder data/ menampung file hasil ekspor dari server, misalnya cadangan buatan mysqldump, sehingga file buatan tangan dan file hasil dump tidak tercampur. Folder tests/ menampung query pemeriksaan yang dijalankan setelah skema dimuat untuk memastikan hasilnya sesuai harapan. Nama file memakai huruf kecil tanpa spasi agar aman diketik di terminal mana pun.

Anatomi File contoh-skema.sql #

Berikut isi lengkap contoh-skema.sql, file skema latihan yang menyertai chapter ini — file yang sama tersedia di bagian Berkas Sumber di bagian bawah halaman dan dapat diunduh langsung:

sql
-- ============================================================
-- contoh-skema.sql — skema awal proyek latihan toko
-- Cara menjalankan dari folder proyek:
--   mysql -h 127.0.0.1 -P 3306 -u root < sql/contoh-skema.sql
-- ============================================================

-- Hapus sisa latihan lama supaya file ini aman dijalankan ulang.
DROP DATABASE IF EXISTS belajar_struktur;
CREATE DATABASE belajar_struktur;
USE belajar_struktur;

CREATE TABLE produk (
  id    INT PRIMARY KEY,
  nama  VARCHAR(100) NOT NULL,
  harga INT NOT NULL,
  stok  INT NOT NULL DEFAULT 0
);

INSERT INTO produk (id, nama, harga, stok) VALUES
  (1, 'Kopi Arabika', 45000, 12),
  (2, 'Teh Melati', 28000, 30),
  (3, 'Gula Aren', 32000, 8);

SELECT id, nama, harga, stok FROM produk ORDER BY id;

Mari kita bedah peran setiap bagiannya:

  1. Baris 1-5 (header komentar): blok komentar pembuka yang mencatat identitas file dan cara menjalankannya. Server mengabaikan baris komentar, tetapi manusia yang membuka file enam bulan kemudian butuh informasi ini.
  2. Baris 7-9 (DROP sampai USE): tiga statement pembuka yang mengembalikan keadaan ke nol lalu menyiapkan database belajar_struktur. Pola DROP DATABASE IF EXISTS diikuti CREATE DATABASE membuat file aman dijalankan berulang kali.
  3. Baris 11-16 (CREATE TABLE): mendefinisikan tabel produk dengan empat kolom — primary key id, nama produk, harga dalam rupiah, dan stok. Detail sintaksnya dibahas tuntas di section Dasar SQL.
  4. Baris 18-21 (INSERT): mengisi tiga baris data contoh dengan id eksplisit supaya hasilnya selalu sama setiap kali file dijalankan.
  5. Baris 23 (SELECT penutup): menampilkan isi tabel sebagai verifikasi bawaan di akhir file — kalau baris data muncul, seluruh file berjalan benar.

Menjalankan File dari Terminal #

Mode batch sudah kita kenal di chapter mysql client; sekarang kita pakai untuk kegunaan yang sesungguhnya. Perintah berikut menjalankan seluruh isi contoh-skema.sql sekaligus tanpa membuka prompt interaktif. Server latihan course ini mendengarkan di port 3306 (instalasi standar memakai 3306), dan path file di bawah mengikuti lokasinya di dalam repo materi — di komputer sendiri, cukup ganti path ke lokasi proyek, misalnya sql/contoh-skema.sql:

bash
 -- @test-bash
mysql -h 127.0.0.1 -P 3306 -u root < content/mysql/persiapan-lingkungan/struktur-folder-dan-file-proyek/contoh-skema.sql

Output yang Dihasilkan:

text
id	nama	harga	stok
1	Kopi Arabika	45000	12
2	Teh Melati	28000	30
3	Gula Aren	32000	8

Tiga hal patut dicermati dari output tersebut. Pertama, hanya baris hasil SELECT yang dicetak — statement CREATE dan INSERT dieksekusi senyap tanpa baris Query OK karena mode batch memang hanya menampilkan hasil query. Kedua, kolom dipisah karakter tab, bukan tabel ASCII, karena client tidak berada dalam sesi interaktif. Ketiga, bila salah satu statement gagal, eksekusi berhenti di titik itu dan pesan galatnya menyertakan nomor baris file, sehingga file panjang tetap mudah diperbaiki.

Memuat File dari Dalam Sesi dengan SOURCE #

Cara kedua memuat file adalah dari dalam sesi interaktif memakai perintah SOURCE. Kita masuk dulu ke sesi mysql, lalu memanggil file tersebut — SOURCE mencari file relatif terhadap direktori tempat client dijalankan:

sql
SOURCE content/mysql/persiapan-lingkungan/struktur-folder-dan-file-proyek/contoh-skema.sql;

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Database changed
Query OK, 0 rows affected (0.00 sec)

Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

+----+--------------+-------+------+
| id | nama         | harga | stok |
+----+--------------+-------+------+
|  1 | Kopi Arabika | 45000 |   12 |
|  2 | Teh Melati   | 28000 |   30 |
|  3 | Gula Aren    | 32000 |    8 |
+----+--------------+-------+------+
3 rows in set (0.00 sec)

Berbeda dengan mode batch, SOURCE menampilkan respons setiap statement persis seperti sesi interaktif. Enam baris Query OK, 0 rows affected di awal mungkin terlihat aneh — baris-baris tersebut berasal dari enam baris komentar di file, karena client mengirim setiap baris komentar sebagai statement kosong dan server menjawabnya dengan Query OK. Baris sesudahnya adalah respons statement yang sungguhan dijalankan: DROP, CREATE DATABASE, Database changed dari USE, CREATE TABLE, INSERT, dan tabel hasil SELECT penutup. Mode batch senyap dan cocok untuk skrip; SOURCE ramai dan cocok saat kita sedang duduk di depan terminal untuk mengamati tiap langkah.

Memeriksa Hasil dengan –execute #

Sesuai konvensi folder kita, pemeriksaan adalah bagian dari proyek, bukan kegiatan sesudahnya. Opsi --execute memeriksa hasil muatan skema tanpa membuka sesi — dua statement berikut berjalan berurutan dalam satu panggilan:

bash
 -- @test-bash
mysql -h 127.0.0.1 -P 3306 -u root -e "SHOW TABLES FROM belajar_struktur; SELECT COUNT(*) AS jumlah_produk FROM belajar_struktur.produk;"

Output yang Dihasilkan:

text
Tables_in_belajar_struktur
produk
jumlah_produk
3

Baris pertama dan kedua membuktikan tabel produk berhasil dibuat oleh file skema, sedangkan dua baris terakhir membuktikan tiga baris data contoh ikut termuat. Query pemeriksaan seperti ini layak disimpan sebagai file di tests/ — misalnya uji-produk.sql — sehingga pemeriksaan yang sama dapat dijalankan ulang kapan pun skema diubah, cukup dengan mysql ... < tests/uji-produk.sql.

Alur Kerja Berulang #

Bekerja dengan file mengubah cara kita belajar menjadi siklus kecil: sunting file, jalankan, periksa, lalu ulangi sampai benar. Diagram berikut merangkum siklus tersebut:

Siklus ini sengaja dibuat identik dengan alur kerja pemrograman pada umumnya supaya kebiasaan dari menulis kode langsung terbawa ke menulis SQL. Folder data/ baru akan terisi saat kita membahas backup dan mysqldump di bagian administrasi course, sedangkan isi tests/ bertambah seiring banyaknya hal yang ingin kita pastikan. Awalnya satu file skema memang terasa berlebihan untuk tiga baris data, tetapi saat skema bertambah puluhan tabel, keputusan kecil hari ini inilah yang menyelamatkan kita.

Referensi #

Lingkungan kerja kita kini lengkap: server terpasang dan terkonfigurasi, dua jalur client dikuasai, parameter koneksi dipahami sampai ke detail galatnya, dan latihan tersimpan rapi sebagai proyek yang dapat dijalankan ulang. Section berikutnya, Dasar SQL, mulai mengisi proyek tersebut dengan materi intinya — dari struktur perintah SQL, memilih database dengan USE, hingga membuat tabel pertama yang sesungguhnya.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh-skema.sql

Unduh berkas
sql
-- ============================================================
-- contoh-skema.sql — skema awal proyek latihan toko
-- Cara menjalankan dari folder proyek:
--   mysql -h 127.0.0.1 -P 3306 -u root < sql/contoh-skema.sql
-- ============================================================

-- Hapus sisa latihan lama supaya file ini aman dijalankan ulang.
DROP DATABASE IF EXISTS belajar_struktur;
CREATE DATABASE belajar_struktur;
USE belajar_struktur;

CREATE TABLE produk (
  id    INT PRIMARY KEY,
  nama  VARCHAR(100) NOT NULL,
  harga INT NOT NULL,
  stok  INT NOT NULL DEFAULT 0
);

INSERT INTO produk (id, nama, harga, stok) VALUES
  (1, 'Kopi Arabika', 45000, 12),
  (2, 'Teh Melati', 28000, 30),
  (3, 'Gula Aren', 32000, 8);

SELECT id, nama, harga, stok FROM produk ORDER BY id;