Let's Go پاسخ‌های مبتنی بر پایگاه داده › راه‌اندازی MySQL
قبلی · فهرست · بعدی
فصل 4.1.

راه‌اندازی MySQL

اگر در حال دنبال کردن هستید، در این مرحله باید MySQL را روی کامپیوتر خود نصب کنید. مستندات رسمی MySQL شامل دستورالعمل‌های نصب جامع برای همه انواع سیستم‌عامل‌ها است، اما اگر از macOS استفاده می‌کنید، باید بتوانید آن را با این دستور نصب کنید:

$ brew install mysql

یا اگر از یک توزیع لینوکس استفاده می‌کنید که از apt پشتیبانی می‌کند (مانند Debian و Ubuntu) می‌توانید آن را با این دستور نصب کنید:

$ sudo apt install mysql-server

در حالی که MySQL را نصب می‌کنید، ممکن است از شما خواسته شود که یک رمز عبور برای کاربر root تنظیم کنید. اگر این کار را انجام دادید، به خاطر داشته باشید که آن را یادداشت کنید؛ در مرحله بعد به آن نیاز خواهید داشت.

اسکلت‌بندی پایگاه داده

پس از نصب MySQL، باید بتوانید از ترمینال خود به عنوان کاربر root به آن متصل شوید. دستور انجام این کار بسته به نسخه MySQL که نصب کرده‌اید متفاوت خواهد بود. برای MySQL 5.7 و جدیدتر باید بتوانید با تایپ کردن این دستور متصل شوید:

$ sudo mysql
mysql>

اما اگر این کار نکرد، به جای آن دستور زیر را امتحان کنید و رمز عبور را که در طول نصب تنظیم کردید وارد کنید.

$ mysql -u root -p
Enter password:
mysql>

پس از اتصال، اولین کاری که باید انجام دهیم ایجاد یک پایگاه داده در MySQL برای ذخیره تمام داده‌های پروژه ما است. دستورات زیر را در پرامپت mysql کپی و پیست کنید تا یک پایگاه داده جدید snippetbox با استفاده از رمزگذاری UTF8 ایجاد کنید.

-- Create a new UTF-8 `snippetbox` database.
CREATE DATABASE snippetbox CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Switch to using the `snippetbox` database.
USE snippetbox;

سپس دستور SQL زیر را کپی و پیست کنید تا یک جدول جدید snippets برای نگه‌داری قطعات متنی برنامه ما ایجاد کنید:

-- Create a `snippets` table.
CREATE TABLE snippets (
    id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(100) NOT NULL,
    content TEXT NOT NULL,
    created DATETIME NOT NULL,
    expires DATETIME NOT NULL
);

-- Add an index on the created column.
CREATE INDEX idx_snippets_created ON snippets(created);

هر رکورد در این جدول یک فیلد id عدد صحیح خواهد داشت که به عنوان شناسه یکتا برای قطعه متنی عمل می‌کند. همچنین یک متن کوتاه title خواهد داشت و محتوای خود snippet در فیلد content ذخیره می‌شود. همچنین برخی از ابرداده‌ها درباره زمان‌هایی که snippet ایجاد شد و زمانی که منقضی می‌شود را نگه می‌داریم.

بیایید همچنین برخی از ورودی‌های نگهدارنده به جدول snippets اضافه کنیم (که در چند فصل بعدی استفاده خواهیم کرد). من از برخی هایکو کوتاه به عنوان محتوا برای قطعات متنی استفاده می‌کنم، اما واقعاً مهم نیست که آن‌ها چه چیزی را شامل می‌شوند.

-- Add some dummy records (which we'll use in the next couple of chapters).
INSERT INTO snippets (title, content, created, expires) VALUES (
    'An old silent pond',
    'An old silent pond...\nA frog jumps into the pond,\nsplash! Silence again.\n\n– Matsuo Bashō',
    UTC_TIMESTAMP(),
    DATE_ADD(UTC_TIMESTAMP(), INTERVAL 365 DAY)
);

INSERT INTO snippets (title, content, created, expires) VALUES (
    'Over the wintry forest',
    'Over the wintry\nforest, winds howl in rage\nwith no leaves to blow.\n\n– Natsume Soseki',
    UTC_TIMESTAMP(),
    DATE_ADD(UTC_TIMESTAMP(), INTERVAL 365 DAY)
);

INSERT INTO snippets (title, content, created, expires) VALUES (
    'First autumn morning',
    'First autumn morning\nthe mirror I stare into\nshows my father''s face.\n\n– Murakami Kijo',
    UTC_TIMESTAMP(),
    DATE_ADD(UTC_TIMESTAMP(), INTERVAL 7 DAY)
);

ایجاد یک کاربر جدید

از نظر امنیتی، اتصال به MySQL به عنوان کاربر root از یک برنامه وب ایده خوبی نیست. در عوض بهتر است یک کاربر پایگاه داده با مجوزهای محدود روی پایگاه داده ایجاد کنید.

بنابراین، در حالی که هنوز به پرامپت MySQL متصل هستید، دستورات زیر را اجرا کنید تا یک کاربر جدید web با مجوزهای SELECT، INSERT، UPDATE و DELETE فقط روی پایگاه داده ایجاد کنید.

CREATE USER 'web'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON snippetbox.* TO 'web'@'localhost';
-- Important: Make sure to swap 'pass' with a password of your own choosing.
ALTER USER 'web'@'localhost' IDENTIFIED BY 'pass';

پس از انجام این کار، exit را تایپ کنید تا از پرامپت MySQL خارج شوید.

تست کاربر جدید

اکنون باید بتوانید به پایگاه داده snippetbox به عنوان کاربر web با استفاده از دستور زیر متصل شوید. وقتی از شما خواسته شد، رمز عبور را که تازه تنظیم کردید وارد کنید.

$ mysql -D snippetbox -u web -p
Enter password:
mysql>

اگر مجوزها به درستی کار می‌کنند، باید متوجه شوید که می‌توانید عملیات SELECT و INSERT را روی پایگاه داده به درستی انجام دهید، اما دستورات دیگر مانند DROP TABLE و GRANT با خطا مواجه می‌شوند.

mysql> SELECT id, title, expires FROM snippets;
+----+------------------------+---------------------+
| id | title                  | expires             |
+----+------------------------+---------------------+
|  1 | An old silent pond     | 2025-03-18 10:00:26 |
|  2 | Over the wintry forest | 2025-03-18 10:00:26 |
|  3 | First autumn morning   | 2024-03-25 10:00:26 |
+----+------------------------+---------------------+
3 rows in set (0.00 sec)

mysql> DROP TABLE snippets;
ERROR 1142 (42000): DROP command denied to user 'web'@'localhost' for table 'snippets'