مایاسکیول
MySQL
اتصال به MySQL/MariaDB، اجرای کوئری SQL و مدیریت دیتابیس
نمای کلی
نود MySQL یکی از مهمترین نودهای n8n برای کار با دیتابیسهای رابطهای است.
قابلیتهای کلیدی:
- اتصال به MySQL و MariaDB
- اجرای کوئریهای SQL دلخواه
- عملیات CRUD (Insert, Select, Update, Delete)
- پشتیبانی از Prepared Statements (جلوگیری از SQL Injection)
- کار با چندین دیتابیس همزمان
- پشتیبانی از SSL/TLS
- پشتیبانی از SSH Tunnel
کاربردها:
- ذخیره داده از APIها و فرمها در دیتابیس
- خواندن اطلاعات کاربران و سفارشات
- بهروزرسانی موجودی و وضعیت سفارش
- گزارشگیری و آمارگیری
- همگامسازی داده بین سیستمها
- پشتیبانگیری خودکار از جداول
- انتقال داده بین دیتابیسها (Migration)
نسخههای پشتیبانی شده:
- MySQL 5.7+
- MySQL 8.0+
- MariaDB 10.x+
- Amazon RDS MySQL
- Google Cloud SQL
- Azure Database for MySQL
احراز هویت
احراز هویت MySQL
روش 1: اتصال مستقیم (رایجترین)
#### مراحل تنظیم:
- 1در n8n به بخش Credentials بروید
- 2MySQL را انتخاب کنید
- 3اطلاعات زیر را وارد کنید:
Host: localhost یا IP سرور (مثل 192.168.1.100)
Port: 3306 (پیشفرض)
Database: نام دیتابیس (مثل my_shop)
User: نام کاربری (مثل root یا n8n_user)
Password: رمز عبور- 1Test Connection را بزنید
- 2ذخیره کنید
روش 2: اتصال SSL (برای Production)
برای امنیت بیشتر:
- 1گواهی SSL را از هاست دریافت کنید
- 2در تنظیمات Credential:
- SSL: ON
- CA Certificate: محتوای فایل
ca-cert.pem - Client Certificate: (اختیاری)
- Client Key: (اختیاری)
روش 3: SSH Tunnel (برای سرورهای محدود)
اگر دسترسی مستقیم به MySQL ندارید:
- 1SSH Tunnel را فعال کنید
- 2اطلاعات SSH:
- SSH Host: آدرس سرور
- SSH Port: 22
- SSH User: نام کاربری SSH
- SSH Password یا Private Key
- 1MySQL از طریق tunnel متصل میشود
ایجاد کاربر اختصاصی MySQL:
-- ایجاد کاربر جدید
CREATE USER 'n8n_user'@'%' IDENTIFIED BY 'StrongPassword123!';
-- دادن دسترسیها
GRANT SELECT, INSERT, UPDATE, DELETE ON my_database.* TO 'n8n_user'@'%';
-- اعمال تغییرات
FLUSH PRIVILEGES;نکات امنیتی:
- هرگز از کاربر
rootدر Production استفاده نکنید - فقط دسترسیهای لازم را بدهید (Least Privilege)
- از SSL برای اتصالهای ریموت استفاده کنید
- IP سرور n8n را در Firewall مجاز کنید
- رمز عبور قوی با حداقل 16 کاراکتر استفاده کنید
عملیاتهای موجود
executeQuery
اجرای هر نوع کوئری SQL دلخواه
insert
افزودن یک یا چند رکورد به جدول
update
بهروزرسانی رکوردها بر اساس شرط
delete
حذف رکوردها از جدول
کاربردهای متداول
1. ذخیره داده فرم در دیتابیس
دریافت فرم از وبسایت و ذخیره:
Webhook (فرم ارسال شد) → MySQL (Insert)
- Table: contacts
- Columns: name, email, phone, message
- Values:
name = {{$json.name}}
email = {{$json.email}}
phone = {{$json.phone}}
message = {{$json.message}}2. خواندن لیست سفارشات
دریافت سفارشات جدید و ارسال به تلگرام:
Schedule (هر 10 دقیقه)
→ MySQL (Execute Query)
SELECT o.*, c.name as customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.status = 'new'
ORDER BY o.created_at DESC
LIMIT 10
→ IF (تعداد > 0)
→ Telegram (ارسال لیست سفارشات)3. بهروزرسانی موجودی
بعد از فروش، موجودی را کاهش بده:
Webhook (فروش جدید)
→ MySQL (Execute Query)
UPDATE products
SET stock = stock - {{$json.quantity}}
WHERE id = {{$json.product_id}}
AND stock >= {{$json.quantity}}
→ IF (affectedRows > 0)
→ True: تایید فروش
→ False: پیام "موجودی کافی نیست"4. گزارش فروش روزانه
ارسال خلاصه فروش روزانه:
Schedule (هر روز ساعت 23:00)
→ MySQL (Execute Query)
SELECT
COUNT(*) as total_orders,
SUM(amount) as total_sales,
AVG(amount) as avg_order,
MAX(amount) as max_order
FROM orders
WHERE DATE(created_at) = CURDATE()
→ Set (فرمت فارسی)
→ Telegram (ارسال گزارش)5. همگامسازی کاربران با CRM
انتقال کاربران جدید از سایت به CRM:
Schedule (هر ساعت)
→ MySQL (Execute Query)
SELECT * FROM users
WHERE synced_to_crm = 0
LIMIT 50
→ Loop
→ HTTP Request (POST به CRM API)
→ MySQL (Update)
SET synced_to_crm = 1
WHERE id = {{$json.id}}6. پاکسازی دادههای قدیمی
حذف خودکار لاگهای قدیمی:
Schedule (هر هفته)
→ MySQL (Execute Query)
DELETE FROM activity_logs
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY)
→ Telegram (گزارش حذف)7. جستجوی پیشرفته
API جستجو با فیلتر:
Webhook (درخواست جستجو)
→ MySQL (Execute Query)
SELECT * FROM products
WHERE name LIKE '%{{$json.keyword}}%'
AND category = '{{$json.category}}'
AND price BETWEEN {{$json.min_price}} AND {{$json.max_price}}
ORDER BY {{$json.sort}} {{$json.order}}
LIMIT {{$json.limit}} OFFSET {{$json.offset}}
→ Respond to Webhook (نتایج JSON)8. بکآپ جدول به Google Sheets
ذخیره داده دیتابیس در اسپردشیت:
Schedule (هر روز ساعت 2 شب)
→ MySQL (Execute Query)
SELECT * FROM customers
→ Google Sheets (Append)
- Spreadsheet: Backup_Customers
- Sheet: {{$now.toFormat('yyyy-MM-dd')}}9. سیستم اعلان موجودی
هشدار کم شدن موجودی:
Schedule (هر 6 ساعت)
→ MySQL (Execute Query)
SELECT name, stock, min_stock
FROM products
WHERE stock <= min_stock
AND stock > 0
→ IF (نتایج > 0)
→ Telegram (هشدار به ادمین)
→ Gmail (ایمیل به انبار)10. Migration بین دو دیتابیس
انتقال داده از دیتابیس قدیم به جدید:
MySQL-Old (Select All)
→ Set (تبدیل فرمت)
→ MySQL-New (Insert)نکات حرفهای
نکات حرفهای
- 1Prepared Statements: برای جلوگیری از SQL Injection:
-- اشتباه (خطرناک):
SELECT * FROM users WHERE email = '{{$json.email}}'
-- صحیح (امن):
-- از پارامتر ? استفاده کنید (n8n خودکار escape میکند)
SELECT * FROM users WHERE email = ?- 1LIMIT همیشه: برای جلوگیری از خواندن همه رکوردها:
SELECT * FROM logs ORDER BY id DESC LIMIT 100- 1Transaction برای عملیات مرتبط:
START TRANSACTION;
UPDATE accounts SET balance = balance - 50000 WHERE id = 1;
UPDATE accounts SET balance = balance + 50000 WHERE id = 2;
COMMIT;- 1Batch Insert: برای درج حجم بالا:
INSERT INTO products (name, price) VALUES
('محصول 1', 10000),
('محصول 2', 20000),
('محصول 3', 30000);- 1Date Functions: توابع تاریخ MySQL:
-- امروز
WHERE DATE(created_at) = CURDATE()
-- 7 روز اخیر
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
-- این ماه
WHERE MONTH(created_at) = MONTH(NOW())
AND YEAR(created_at) = YEAR(NOW())- 1Aggregation: توابع محاسباتی:
SELECT
category,
COUNT(*) as count,
SUM(amount) as total,
AVG(amount) as average,
MIN(amount) as minimum,
MAX(amount) as maximum
FROM orders
GROUP BY category
HAVING total > 1000000
ORDER BY total DESC- 1JOIN: ترکیب جداول:
SELECT o.id, o.amount, c.name, c.email
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
LEFT JOIN products p ON o.product_id = p.id
WHERE o.status = 'completed'- 1Index: برای فیلدهای پرجستجو Index بگذارید:
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_status_date ON orders(status, created_at);- 1UPSERT: درج یا بهروزرسانی:
INSERT INTO stats (date, visits)
VALUES (CURDATE(), 1)
ON DUPLICATE KEY UPDATE visits = visits + 1;- 1Subquery: کوئری تودرتو:
SELECT * FROM products
WHERE category_id IN (
SELECT id FROM categories WHERE active = 1
)- 1CASE WHEN: شرط در کوئری:
SELECT name,
CASE
WHEN stock > 100 THEN 'فراوان'
WHEN stock > 10 THEN 'محدود'
ELSE 'تمام شده'
END as status
FROM products- 1فرمت اعداد فارسی: تبدیل قیمت ریال به تومان:
SELECT
name,
FORMAT(price / 10, 0) as price_toman
FROM products- 1Backup با SELECT INTO OUTFILE:
SELECT * FROM orders
INTO OUTFILE '/tmp/orders_backup.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'- 1Performance Tips:
- از
SELECT *اجتناب کنید، فقط ستونهای لازم را بخوانید - برای COUNT از
COUNT(1)به جایCOUNT(*)استفاده کنید - از EXPLAIN برای تحلیل کوئری استفاده کنید
- 1دسترسی به نتایج در n8n:
// تعداد رکوردهای تغییر یافته
{{$json.affectedRows}}
// آخرین ID درج شده
{{$json.insertId}}
// فیلد خاص از نتیجه
{{$json.name}}رفع مشکلات
خطاهای رایج
1. خطای "Connection refused" (ECONNREFUSED)
علت: MySQL در حال اجرا نیست یا آدرس/پورت اشتباه است
راهحل
- مطمئن شوید MySQL روشن است:
sudo systemctl status mysql - پورت پیشفرض 3306 را بررسی کنید
- Firewall را چک کنید:
sudo ufw allow 3306 - اگر MySQL روی سرور دیگر است، bind-address را بررسی کنید:
# /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0 # اجازه اتصال از همه IPها2. خطای "Access denied for user"
علت: نام کاربری، رمز عبور یا دسترسی اشتباه
راهحل
- Username و Password را دوباره بررسی کنید
- دسترسی کاربر را چک کنید:
SHOW GRANTS FOR 'n8n_user'@'%';- اگر از ریموت وصل میشوید، Host را @ '%' بگذارید:
CREATE USER 'n8n_user'@'%' IDENTIFIED BY 'password';3. خطای "Unknown database"
علت: نام دیتابیس اشتباه است
راهحل
- نام دقیق را بررسی کنید:
SHOW DATABASES;- MySQL case-sensitive است در لینوکس
4. خطای "Table doesn't exist"
علت: نام جدول اشتباه یا دیتابیس اشتباه انتخاب شده
راهحل
- جداول دیتابیس را ببینید:
SHOW TABLES;- از نام کامل استفاده کنید:
database_name.table_name
5. خطای "Data too long for column"
علت: داده بزرگتر از ستون است
راهحل
- نوع ستون را بررسی و تغییر دهید:
ALTER TABLE my_table MODIFY COLUMN description TEXT;- داده را قبل از ذخیره Truncate کنید
6. خطای "Duplicate entry"
علت: رکورد با کلید یکتای مشابه وجود دارد
راهحل
- از
INSERT ... ON DUPLICATE KEY UPDATEاستفاده کنید:
INSERT INTO users (email, name) VALUES ('ali@test.com', 'Ali')
ON DUPLICATE KEY UPDATE name = VALUES(name);- یا از
INSERT IGNOREاستفاده کنید
7. خطای Timeout
علت: کوئری خیلی سنگین است
راهحل
- Index اضافه کنید:
CREATE INDEX idx_created_at ON orders(created_at);- از LIMIT استفاده کنید
- کوئری را بهینه کنید با EXPLAIN:
EXPLAIN SELECT * FROM orders WHERE status = 'new';