PDA

View Full Version : سوال: Migration چیست؟



captain_hamid
چهارشنبه 07 آبان 1393, 08:18 صبح
سلام دوستان
migration چیه؟ یه اطلاعاتی به دست آوردم اما بازم واسم مبهمه.
من میخوام از یک ORM تو پروژم استفاده کنم. این migration چیه گه همه جا ازش نام برده شده.
لطفا لینک ویکی پدیا و از این قبیل نگذارید.
ممنون.

MMSHFE
چهارشنبه 07 آبان 1393, 10:15 صبح
بطور خلاصه بخوام بگم، همونطور که SVN به شما امکان Version Control توی سورس کد میده، Migration هم این امکان رو توی دیتابیس بهتون میده. شما با یکسری دستورات، نسخه های مختلفی رو تولید میکنید (مثلاً توی فلان نسخه فلان جدول ساخته میشه و...) و بعد با migrate up یا migrate down میتونید بین نسخه های مختلف دیتابیس حرکت کنید. فرضاً گاهی ممکنه لازم بشه برای تست یک بخش خاص، دیتابیس به چند نسخه قبل برگرده (یکسری جداول و ارتباطها حذف بشن) و بعد از اصلاح کد، دوباره به نسخه جدید برگردین. این کارها رو میتونید با کمک Migrationها انجام بدین.

captain_hamid
چهارشنبه 07 آبان 1393, 10:28 صبح
خیلی ممنون از توضیحاتتون.
من از ORM Eloquent تو پروژم استفاده میکنم.(حالا نوع ORM فرقی نمیکنه)
با composer اون رو به پروژه اضافه کردم.
و این کد هم واسه تست تو فایل index گذاشتم و اجرا کردم.



<?php
require 'vendor/autoload.php';
$container = new Illuminate\Container\Container;
$resolver = new Illuminate\Database\ConnectionResolver;
$resolver->setDefaultConnection('default');
$factory = new Illuminate\Database\Connectors\ConnectionFactory($ container);
$connection = $factory->make(array(
'host' => 'localhost',
'database' => 'eloquent',
'username' => 'root',
'password' => '',
'collation' => 'utf8_general_ci',
'driver' => 'mysql',
'charset' => 'utf8',
'prefix' => '',
));
$resolver->addConnection('default', $connection);
Illuminate\Database\Eloquent\Model::setConnectionR esolver($resolver);
/** use Eloquent **/
use Illuminate\Database\Eloquent\Model as Model;
class Users extends Model {
protected $primaryKey = 'id_user';
public $timestamps = false;
}
$user = new Users;
$user->name = 'John';
$user->save();




مشکل اینجاست که وقتی این کد رو اجرا میکنم. سه بار تو دیتابیس عمل insert انجام میشه. دلیلش چی میتونه باشه.
سوال بعدی که دارم اینه که برای اینکه با oracle و یا MSSQL و ... سازگار باشه فقط باید خط مربوط به درایور رو تغییر بدم؟ ساختار model با همین روش درسته؟
create table که بخواد با همه دیتابیس ها سازگا باشه چطوره؟(دو هفته هست ک میخونم هم از سایت laravel هم منابع دیگه اما بازم مبحث واسم کوره)
ممنون

MMSHFE
چهارشنبه 07 آبان 1393, 10:31 صبح
وقتی با PDO و ORM کار میکنید فقط باید connectionString اصلاح بشه. درمورد کدتون هم که چرا سه بار درج میشه حقیقتش توی کد مشکل خاصی نمیبینم. requireها رو به require_once تغییر بدین شاید ضمیمه شدن چندباره باعثش شده باشه.

captain_hamid
چهارشنبه 07 آبان 1393, 10:46 صبح
جناب شهرکی
فقط یه سوال تو ذهنم هست.
من میخوام پروژم با دیتابیس های دیگه هم کار کنه.
واسه همین از ORM استفاده میکنم. من میتونم بدون استفاده از ORM و فقط استفاده از PDO این کار رو انجام بدم.
همچنین می خوام یه سیستم مثل وردپرس که همون ابتدا تو محیط browser و یک محیط گرافیکی که فرد بتونه درایور، نام دیتابیس و prefix رو بگیره.و کوئری ها مربوطه رو اجرا کنه.
من همه مراحل رو انجام دادم و فقط تو همین قسمت موندم.
لازم به ذکر که تو دیتابیسم کلید خارجی هم دارم.
پروژم با angular و rest aapi نوشتم. که واسه rest و ارتباط با سرور از فرم ورک slim استفاده میکنم. البته خودم قسمت rest رو نوشتم ولی واسه اینکه یه ساختار داشته باشه از slim استفاده میکنم.
خیلی تحقیق کردم اما اینجا رو واقعا راهکاری واسش ندارم.
ممنون

MMSHFE
چهارشنبه 07 آبان 1393, 10:56 صبح
این کار با همون PDO ساده هم قابل انجامه. برای تنظیمات هم کافیه ابتدا تو اسکریپتتون فایل تنظیمات نداشته باشین و اسکریپت هربار اجرا میشه، اگه فایل تنظیمات نبود، کاربر رو به صفحه تنظیمات هدایت کنه. توی این صفحه اطلاعات درایور و نام دیتابیس و... رو میگیرین و مطابق اونها، فایل تنظیمات رو میسازین. دفعات بعد دیگه این صفحه نمیاد چون فایل تنظیمات وجود داره.

captain_hamid
چهارشنبه 07 آبان 1393, 11:07 صبح
خیلی خیلی ممنون.
فقط آخرین سوال
روش من تو rest اینه که همون اول که درخواست میاد یک شی از کلاسم میسازم. کلاس من شامل تمام فانکش هایی که ممکنه (مثل افزودن کاربر، حذف کاربر، افزدون خبر، و ...) هست.
با ساخته شدن object از روی کلاس ابتدا فانکشن proccessApi اجرا میشه. و بعد از اون proccessApi فانکشن مربوطه که تو همون کلاس هست رو صدا میزنه. ولی اینجوری کدم خیلی زیاد شده داخل یک کلاس. آیا تو پرفورمنس تاثیر داره؟ واسه همین می خوام از slim استفاده کنم.
به عنوان مشاوره تو این زمینه چ کاری بکنم ک بعدا تو توسعه کدها به مشکل برنخورم؟
پس orm رو بگذارم کنار؟

MMSHFE
چهارشنبه 07 آبان 1393, 11:26 صبح
والا اگه روی سرورتون APC یا OPCache نصب و فعال باشه، مشکلی توی حجیم شدن کلاسها نخواهید داشت. درغیر اینصورت بهتره کدها رو بشکنید. درمورد ORM هم اگه از امکانات خاصش مثل Eloquent و... استفاده نمیکنید، بهتره بگذارینش کنار چون سربارش بیشتر از منافعش برای شما خواهد بود.