Sqler

یک سازنده کوئری SQL قدرتمند و انعطاف‌پذیر برای Dart، با تمرکز بر پشتیبانی از MySQL و SQLite3 با طراحی رابط روان.

Pub Version Dev Donate issues-closed issues-open Contributions

ویژگی‌ها

  • رابط روان: ساخت کوئری‌های SQL با استفاده از زنجیره‌سازی متدها برای خوانایی بهتر
  • نوع-ایمن: ساخت کوئری‌ها با امنیت در زمان کامپایل
  • پشتیبانی جامع: عملیات SELECT، INSERT، UPDATE، DELETE
  • بندهای پیشرفته: WHERE، JOIN، GROUP BY، HAVING، ORDER BY، LIMIT
  • کوئری‌های پارامتری: پشتیبانی از پارامترهای نام‌دار برای جلوگیری از SQL injection
  • Escaping مناسب: نقل‌قول خودکار فیلدها و escape کردن مقادیر
  • عملیات پیچیده: زیرکوئری‌ها، دستورات CASE، توابع تجمیعی
  • بهینه‌شده برای MySQL: طراحی‌شده به‌طور خاص برای سینتکس و ویژگی‌های MySQL
  • بهینه‌شده برای SQLite: طراحی‌شده به‌طور خاص برای سینتکس و ویژگی‌های SQLite

نصب

این را به فایل pubspec.yaml پکیج خود اضافه کنید:

dependencies:
  sqler: 

یا

dart pub add sqler

سپس اجرا کنید:

dart pub get

شروع سریع

import 'package:sqler/sqler.dart';

void main() {
  // ساخت جدول
  var books = MTable(
    name: 'books',
    fields: [
      MFieldInt(name: 'id', isPrimaryKey: true, isAutoIncrement: true),
      MFieldVarchar(name: 'name', length: 255),
      MFieldVarchar(name: 'author', length: 255),
      MFieldInt(name: 'publication_year'),
      MFieldDate(name: 'published_date'),
      MFieldText(name: 'content'),
    ],
  );

  // کوئری SELECT ساده
  var query = Sqler()
    .addSelect(QSelect('name'))
    .addSelect(QSelect('published_date'))
    .from(QField('books'))
    .where(WhereOne(QField('publication_year'), QO.EQ, QVar(1980)))
    .orderBy(QOrder('name'))
    .limit(10);

  print(query.toSQL());

  /// چاپ برای SQLite:
  print(query.toSQL<Sqlite>());
}

SQLite

برای تولید کوئری SQL به‌طور خاص در فرمت SQLite، Sqlite را به‌عنوان پارامتر نوع به تابع toSQL ارسال کنید:

query.toSQL<Sqlite>()

این تضمین می‌کند که سینتکس SQL تولید شده با SQLite سازگار است.

کلاس‌های اصلی

Sqler

کلاس اصلی سازنده کوئری که یک رابط روان برای ساخت کوئری‌های SQL ارائه می‌دهد.

QField

نمایانگر فیلدهای پایگاه داده با نقل‌قول مناسب:

QField('users.name')     // users.`name`
QField('table_name')     // `table_name`

QVar

نمایانگر مقادیر با escape مناسب:

QVar('string value')     // 'string value'
QVar(123)               // 123
QVar(true)              // true
QVar(null)              // NULL

QSelect

نمایانگر فیلدهای SELECT با نام مستعار اختیاری:

QSelect('name')                    // `name`
QSelect('users.name', 'user_name') // users.`name` AS `user_name`

مثال‌های استفاده

کوئری SELECT پایه

var query = Sqler()
  .addSelect(QSelect('id'))
  .addSelect(QSelect('name'))
  .addSelect(QSelect('email'))
  .from(QField('users'));

print(query.toSQL());
// SELECT `id`, `name`, `email` FROM `users`

SELECT با شرایط WHERE

var query = Sqler()
  .addSelect(QSelect('*'))
  .from(QField('users'))
  .where(AndWhere([
    WhereOne(QField('active'), QO.EQ, QVar(true)),
    WhereOne(QField('age'), QO.GT, QVar(18))
  ]));

print(query.toSQL());
// SELECT * FROM `users` WHERE ( ( `active` = true ) ) AND ( ( `age` > 18 ) )

SELECT با JOIN‌ها

var query = Sqler()
  .addSelect(QSelect('users.name'))
  .addSelect(QSelect('profiles.bio'))
  .from(QField('users'))
  .join(LeftJoin('profiles', On([
    Condition(QField('users.id'), QO.EQ, QField('profiles.user_id'))
  ])))
  .where(WhereOne(QField('users.active'), QO.EQ, QVar(true)));

print(query.toSQL());
// SELECT `users`.`name`, `profiles`.`bio` FROM `users` 
// LEFT JOIN `profiles` ON ( ( `users`.`id` = `profiles`.`user_id` ) ) 
// WHERE ( `users`.`active` = true )

عملیات INSERT

// درج یک رکورد
var query = Sqler()
  .insert(QField('users'), [
    {
      'name': QVar('John Doe'),
      'email': QVar('[email protected]'),
      'active': QVar(true),
      'age': QVar(30)
    }
  ]);

print(query.toSQL());
// INSERT INTO `users` (`name`, `email`, `active`, `age`) 
// VALUES ('John Doe', '[email protected]', true, 30)
// درج چندین رکورد
var query = Sqler()
  .insert(QField('users'), [
    {
      'name': QVar('John Doe'),
      'email': QVar('[email protected]')
    },
    {
      'name': QVar('Jane Smith'),
      'email': QVar('[email protected]')
    }
  ]);

print(query.toSQL());
// INSERT INTO `users` (`name`, `email`) 
// VALUES ('John Doe', '[email protected]'), ('Jane Smith', '[email protected]')

عملیات UPDATE

var query = Sqler()
  .update(QField('users'), {
    'name': QVar('Updated Name'),
    'email': QVar('[email protected]')
  })
  .where(WhereOne(QField('id'), QO.EQ, QVar(1)));

print(query.toSQL());
// UPDATE `users` SET `name` = 'Updated Name', `email` = '[email protected]' 
// WHERE ( `id` = 1 )

عملیات DELETE

var query = Sqler()
  .delete()
  .from(QField('users'))
  .where(WhereOne(QField('active'), QO.EQ, QVar(false)));

print(query.toSQL());
// DELETE FROM `users` WHERE ( `active` = false )

کوئری‌های پیچیده با GROUP BY و HAVING

var query = Sqler()
  .addSelect(QSelect('department'))
  .addSelect(QSelectFunc('COUNT', [QField('id')], 'employee_count'))
  .from(QField('employees'))
  .where(WhereOne(QField('active'), QO.EQ, QVar(true)))
  .groupBy(QField('department'))
  .having(HavingOne(QSelectFunc('COUNT', [QField('id')]), QO.GT, QVar(5)))
  .orderBy(QOrder('employee_count', OrderDirection.DESC));

print(query.toSQL());
// SELECT `department`, COUNT(`id`) AS `employee_count` FROM `employees` 
// WHERE ( `active` = true ) GROUP BY `department` 
// HAVING ( COUNT(`id`) > 5 ) ORDER BY `employee_count` DESC

کوئری‌های پارامتری

var query = Sqler()
  .addSelect(QSelect('*'))
  .from(QField('users'))
  .where(WhereOne(QField('name'), QO.EQ, QParam('user_name')))
  .param('user_name', QVar('John Doe'));

print(query.toSQL());
// SELECT * FROM `users` WHERE ( `name` = :user_name )

var params = query.getParams();
// {'user_name': QVar('John Doe')}

عملگرها

کلاس QO عملگرهای مقایسه‌ای مختلفی ارائه می‌دهد:

  • QO.EQ - مساوی (=)
  • QO.NE - نامساوی (!=)
  • QO.GT - بزرگتر از (>)
  • QO.GTE - بزرگتر یا مساوی (>=)
  • QO.LT - کوچکتر از (<)
  • QO.LTE - کوچکتر یا مساوی (<=)
  • QO.LIKE - تطابق الگوی LIKE
  • QO.NOT_LIKE - تطابق الگوی NOT LIKE
  • QO.IN - لیست IN
  • QO.NOT_IN - لیست NOT IN
  • QO.IS_NULL - IS NULL
  • QO.IS_NOT_NULL - IS NOT NULL

شرایط WHERE

شرایط پایه

WhereOne(QField('status'), QO.EQ, QVar('active'))

شرایط ترکیبی

AndWhere([
  WhereOne(QField('active'), QO.EQ, QVar(true)),
  WhereOne(QField('age'), QO.GTE, QVar(18))
])

OrWhere([
  WhereOne(QField('role'), QO.EQ, QVar('admin')),
  WhereOne(QField('role'), QO.EQ, QVar('moderator'))
])

انواع JOIN

  • InnerJoin - INNER JOIN
  • LeftJoin - LEFT JOIN
  • RightJoin - RIGHT JOIN
.join(InnerJoin('table2', On([
  Condition(QField('table1.id'), QO.EQ, QField('table2.table1_id'))
])))

🚀 نسخه بتا - مشارکت شما مهم است!

Sqler در حال حاضر در مرحله بتا است! ما هیجان‌زده هستیم که این سازنده کوئری SQL قدرتمند را با جامعه Dart به اشتراک بگذاریم، و دوست داریم کمک شما را برای بهتر کردن آن دریافت کنیم.

چگونه می‌توانید کمک کنید

این نسخه بتا به این معناست که ما به‌طور فعال به دنبال بازخورد و مشارکت توسعه‌دهندگانی مانند شما هستیم! در اینجا چند راه برای مشارکت وجود دارد:

  • 🐛 گزارش باگ: چیزی یافتید که طبق انتظار کار نمی‌کند؟ لطفاً یک issue باز کنید!
  • 📝 مستندات: به ما کمک کنید مستندات، مثال‌ها و راهنماها را بهبود دهیم
  • 💡 درخواست ویژگی: ایده‌هایی برای ویژگی‌های جدید دارید؟ دوست داریم آن‌ها را بشنویم!
  • 🔧 مشارکت در کد: Pull Request ارسال کنید تا به بهبود کدبیس کمک کنید
  • 🧪 تست: از Sqler در پروژه‌های خود استفاده کنید و تجربه خود را به اشتراک بگذارید

حمایت خود را نشان دهید

از آنجایی که ما از ستاره‌ها و امتیازها به‌عنوان معیار اصلی برای سنجش علاقه جامعه و راهنمایی اولویت‌های توسعه خود استفاده می‌کنیم، واقعاً قدردان خواهیم بود اگر:

  • به ما در GitHub ستاره بدهید: به دیگران کمک کنید Sqler را کشف کنند!
  • 👍 این پکیج را لایک کنید: حمایت شما به ما انگیزه می‌دهد که به بهبود ادامه دهیم
  • 📢 با دیگران به اشتراک بگذارید: به توسعه‌دهندگان دیگر درباره Sqler بگویید

بازخورد و مشارکت شما در کمک به ما برای ساخت بهترین سازنده کوئری SQL برای Dart بسیار ارزشمند است. از اینکه بخشی از سفر ما هستید، متشکریم! 🙏

مشارکت

مشارکت‌ها خوش‌آمدید هستند! لطفاً با خیال راحت یک Pull Request ارسال کنید. برای تغییرات عمده، لطفاً ابتدا یک issue باز کنید تا درباره آنچه می‌خواهید تغییر دهید، بحث کنیم.

مجوز

این پروژه تحت مجوز MIT منتشر شده است - برای جزئیات فایل LICENSE را ببینید.

مخزن

https://github.com/uproid/sqler