پایگاه داده — MySQL
فینچ یک لایه MySQL سهلایه ارائه میدهد: MTable/MField برای تعریف schema، Sqler برای ساخت کوئری، و DatabaseDriver برای اجرا.
پیکربندی
FinchConfigs(
mysqlConfig: FinchMysqlConfig(
enable: true,
host: env['MYSQL_HOST'] ?? 'localhost',
port: (env['MYSQL_PORT'] ?? '3306').toInt(def: 3306),
user: env['MYSQL_USER'] ?? 'db_user',
pass: env['MYSQL_PASS'] ?? 'db_password',
databaseName: env['MYSQL_DATABASE'] ?? 'my_db',
),
)
تعریف جدول
جداول را با MTable و نوعهای MField* تعریف کنید:
// lib/db/tables.dart
import 'package:finch/finch_mysql.dart';
MTable usersTable = MTable(
tableName: 'users',
fields: [
MFieldId(), // PRIMARY KEY AUTO_INCREMENT
MFieldString(name: 'name', length: 100),
MFieldString(name: 'email', length: 255, unique: true),
MFieldString(name: 'password_hash', length: 255),
MFieldBool(name: 'is_active', defaultValue: true),
MFieldTimestamp(name: 'created_at', defaultNow: true),
],
);
نوعهای MField
| نوع | SQL معادل | ویژگیهای کلیدی |
|---|---|---|
MFieldId() |
INT PRIMARY KEY AUTO_INCREMENT |
— |
MFieldString |
VARCHAR(n) |
length, unique, nullable |
MFieldText |
TEXT |
nullable |
MFieldInt |
INT |
defaultValue, nullable |
MFieldBool |
TINYINT(1) |
defaultValue |
MFieldDouble |
DOUBLE |
defaultValue |
MFieldTimestamp |
TIMESTAMP |
defaultNow |
MFieldJson |
JSON |
— |
MFieldForeignKey |
INT + FOREIGN KEY |
references, onDelete |
کوئری با Sqler
SELECT
var sqler = Sqler(table: usersTable);
// انتخاب تمام ردیفهای فعال
var rows = await sqler
.where('is_active', '=', true)
.orderBy('created_at', desc: true)
.limit(20)
.get();
INSERT
var id = await sqler.insert({
'name': 'علی',
'email': '[email protected]',
'password_hash': hashPassword(password),
'is_active': true,
});
UPDATE
await sqler
.where('id', '=', userId)
.update({'name': 'علی احمدی'});
DELETE
await sqler
.where('id', '=', userId)
.delete();
GROUP BY و HAVING
var stats = await sqler
.select(['role', 'COUNT(*) as count'])
.groupBy('role')
.having('count', '>', 5)
.get();
مدیریت نتایج
// دریافت لیست Mapها
List<Map<String, dynamic>> rows = await sqler.get();
// دریافت یک ردیف
Map<String, dynamic>? row = await sqler.first();
// بررسی وجود ردیف
bool exists = await sqler.where('email', '=', email).exists();
// تعداد ردیفها
int count = await sqler.where('is_active', '=', true).count();
DatabaseDriver خام
برای SQL خام:
var db = DatabaseDriver();
var results = await db.query('SELECT * FROM users WHERE id = ?', [userId]);