مستندات n8n
74+ نود
🗄️

مای‌اسکیول

MySQL

اتصال به MySQL/MariaDB، اجرای کوئری SQL و مدیریت دیتابیس

دیتابیس
متوسط
۰ بازدید
n8n 1.0+

نمای کلی

نود 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. 1در n8n به بخش Credentials بروید
  2. 2MySQL را انتخاب کنید
  3. 3اطلاعات زیر را وارد کنید:
code
Host: localhost یا IP سرور (مثل 192.168.1.100)
Port: 3306 (پیش‌فرض)
Database: نام دیتابیس (مثل my_shop)
User: نام کاربری (مثل root یا n8n_user)
Password: رمز عبور
  1. 1Test Connection را بزنید
  2. 2ذخیره کنید

روش 2: اتصال SSL (برای Production)

برای امنیت بیشتر:

  1. 1گواهی SSL را از هاست دریافت کنید
  2. 2در تنظیمات Credential:
  • SSL: ON
  • CA Certificate: محتوای فایل ca-cert.pem
  • Client Certificate: (اختیاری)
  • Client Key: (اختیاری)

روش 3: SSH Tunnel (برای سرورهای محدود)

اگر دسترسی مستقیم به MySQL ندارید:

  1. 1SSH Tunnel را فعال کنید
  2. 2اطلاعات SSH:
  • SSH Host: آدرس سرور
  • SSH Port: 22
  • SSH User: نام کاربری SSH
  • SSH Password یا Private Key
  1. 1MySQL از طریق tunnel متصل می‌شود

ایجاد کاربر اختصاصی MySQL:

sql
-- ایجاد کاربر جدید
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 کاراکتر استفاده کنید

عملیات‌های موجود

1

executeQuery

اجرای هر نوع کوئری SQL دلخواه

2

insert

افزودن یک یا چند رکورد به جدول

3

update

به‌روزرسانی رکوردها بر اساس شرط

4

delete

حذف رکوردها از جدول

کاربردهای متداول

1. ذخیره داده فرم در دیتابیس

دریافت فرم از وب‌سایت و ذخیره:

code
Webhook (فرم ارسال شد) → MySQL (Insert)
  - Table: contacts
  - Columns: name, email, phone, message
  - Values:
    name = {{$json.name}}
    email = {{$json.email}}
    phone = {{$json.phone}}
    message = {{$json.message}}

2. خواندن لیست سفارشات

دریافت سفارشات جدید و ارسال به تلگرام:

code
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. به‌روزرسانی موجودی

بعد از فروش، موجودی را کاهش بده:

code
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. گزارش فروش روزانه

ارسال خلاصه فروش روزانه:

code
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:

code
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. پاکسازی داده‌های قدیمی

حذف خودکار لاگ‌های قدیمی:

code
Schedule (هر هفته)
  → MySQL (Execute Query)
    DELETE FROM activity_logs
    WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY)
  → Telegram (گزارش حذف)

7. جستجوی پیشرفته

API جستجو با فیلتر:

code
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

ذخیره داده دیتابیس در اسپردشیت:

code
Schedule (هر روز ساعت 2 شب)
  → MySQL (Execute Query)
    SELECT * FROM customers
  → Google Sheets (Append)
    - Spreadsheet: Backup_Customers
    - Sheet: {{$now.toFormat('yyyy-MM-dd')}}

9. سیستم اعلان موجودی

هشدار کم شدن موجودی:

code
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 بین دو دیتابیس

انتقال داده از دیتابیس قدیم به جدید:

code
MySQL-Old (Select All)
  → Set (تبدیل فرمت)
  → MySQL-New (Insert)

نکات حرفه‌ای

نکات حرفه‌ای

  1. 1Prepared Statements: برای جلوگیری از SQL Injection:
sql
-- اشتباه (خطرناک):
   SELECT * FROM users WHERE email = '{{$json.email}}'

   -- صحیح (امن):
   -- از پارامتر ? استفاده کنید (n8n خودکار escape می‌کند)
   SELECT * FROM users WHERE email = ?
  1. 1LIMIT همیشه: برای جلوگیری از خواندن همه رکوردها:
sql
SELECT * FROM logs ORDER BY id DESC LIMIT 100
  1. 1Transaction برای عملیات مرتبط:
sql
START TRANSACTION;
   UPDATE accounts SET balance = balance - 50000 WHERE id = 1;
   UPDATE accounts SET balance = balance + 50000 WHERE id = 2;
   COMMIT;
  1. 1Batch Insert: برای درج حجم بالا:
sql
INSERT INTO products (name, price) VALUES
   ('محصول 1', 10000),
   ('محصول 2', 20000),
   ('محصول 3', 30000);
  1. 1Date Functions: توابع تاریخ MySQL:
sql
-- امروز
   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())
  1. 1Aggregation: توابع محاسباتی:
sql
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
  1. 1JOIN: ترکیب جداول:
sql
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'
  1. 1Index: برای فیلدهای پرجستجو Index بگذارید:
sql
CREATE INDEX idx_email ON users(email);
   CREATE INDEX idx_status_date ON orders(status, created_at);
  1. 1UPSERT: درج یا به‌روزرسانی:
sql
INSERT INTO stats (date, visits)
   VALUES (CURDATE(), 1)
   ON DUPLICATE KEY UPDATE visits = visits + 1;
  1. 1Subquery: کوئری تودرتو:
sql
SELECT * FROM products
    WHERE category_id IN (
      SELECT id FROM categories WHERE active = 1
    )
  1. 1CASE WHEN: شرط در کوئری:
sql
SELECT name,
      CASE
        WHEN stock > 100 THEN 'فراوان'
        WHEN stock > 10 THEN 'محدود'
        ELSE 'تمام شده'
      END as status
    FROM products
  1. 1فرمت اعداد فارسی: تبدیل قیمت ریال به تومان:
sql
SELECT
      name,
      FORMAT(price / 10, 0) as price_toman
    FROM products
  1. 1Backup با SELECT INTO OUTFILE:
sql
SELECT * FROM orders
    INTO OUTFILE '/tmp/orders_backup.csv'
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
  1. 1Performance Tips:
  • از SELECT * اجتناب کنید، فقط ستون‌های لازم را بخوانید
  • برای COUNT از COUNT(1) به جای COUNT(*) استفاده کنید
  • از EXPLAIN برای تحلیل کوئری استفاده کنید
  1. 1دسترسی به نتایج در n8n:
javascript
// تعداد رکوردهای تغییر یافته
    {{$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 را بررسی کنید:
code
# /etc/mysql/mysql.conf.d/mysqld.cnf
  bind-address = 0.0.0.0  # اجازه اتصال از همه IPها

2. خطای "Access denied for user"

علت: نام کاربری، رمز عبور یا دسترسی اشتباه

راه‌حل

  • Username و Password را دوباره بررسی کنید
  • دسترسی کاربر را چک کنید:
sql
SHOW GRANTS FOR 'n8n_user'@'%';
  • اگر از ریموت وصل می‌شوید، Host را @ '%' بگذارید:
sql
CREATE USER 'n8n_user'@'%' IDENTIFIED BY 'password';

3. خطای "Unknown database"

علت: نام دیتابیس اشتباه است

راه‌حل

  • نام دقیق را بررسی کنید:
sql
SHOW DATABASES;
  • MySQL case-sensitive است در لینوکس

4. خطای "Table doesn't exist"

علت: نام جدول اشتباه یا دیتابیس اشتباه انتخاب شده

راه‌حل

  • جداول دیتابیس را ببینید:
sql
SHOW TABLES;
  • از نام کامل استفاده کنید: database_name.table_name

5. خطای "Data too long for column"

علت: داده بزرگتر از ستون است

راه‌حل

  • نوع ستون را بررسی و تغییر دهید:
sql
ALTER TABLE my_table MODIFY COLUMN description TEXT;
  • داده را قبل از ذخیره Truncate کنید

6. خطای "Duplicate entry"

علت: رکورد با کلید یکتای مشابه وجود دارد

راه‌حل

  • از INSERT ... ON DUPLICATE KEY UPDATE استفاده کنید:
sql
INSERT INTO users (email, name) VALUES ('ali@test.com', 'Ali')
  ON DUPLICATE KEY UPDATE name = VALUES(name);
  • یا از INSERT IGNORE استفاده کنید

7. خطای Timeout

علت: کوئری خیلی سنگین است

راه‌حل

  • Index اضافه کنید:
sql
CREATE INDEX idx_created_at ON orders(created_at);
  • از LIMIT استفاده کنید
  • کوئری را بهینه کنید با EXPLAIN:
sql
EXPLAIN SELECT * FROM orders WHERE status = 'new';
اشتراک‌گذاری:

آیا این مستندات مفید بود؟