Yii - Di chuyển cơ sở dữ liệu

Trong quá trình phát triển một ứng dụng hướng cơ sở dữ liệu, cấu trúc cơ sở dữ liệu sẽ phát triển cùng với mã nguồn. Yii cung cấpdatabase migration tính năng cho phép bạn theo dõi các thay đổi của cơ sở dữ liệu.

Yii cung cấp các công cụ dòng lệnh di chuyển sau:

  • Tạo di chuyển mới
  • Hoàn nguyên di chuyển
  • Áp dụng di chuyển
  • Áp dụng lại di chuyển
  • Hiển thị lịch sử và trạng thái di chuyển

Tạo di chuyển

Hãy để chúng tôi tạo một di chuyển cơ sở dữ liệu mới.

Step 1 - Bên trong thư mục gốc của mẫu ứng dụng cơ bản, mở cửa sổ giao diện điều khiển và chạy.

./yii migrate/create add_news_table

Lệnh trên sẽ tạo một tệp di chuyển mới (trong trường hợp này là m160113_102634_add_news_table.php) trong migrations thư mục.

Tệp chứa đoạn mã sau:

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_102634_add_news_table extends Migration {
      public function up() {
   
      }
      public function down() {
         echo "m160113_102634_add_news_table cannot be reverted.\n";
         return false;
      }
      /*
      // Use safeUp/safeDown to run migration code within a transaction
      public function safeUp() {
 
      }
      public function safeDown() {
   
      }
      */
   }
?>

Mỗi lần di chuyển DB là một lớp PHP mở rộng yii\db\Migrationlớp học. Tên lớp được tạo theo định dạng sau:

m<YYMMDD_HHMMSS>_<Name>

Ở đâu <YYMMDD_HMMSS> là ngày giờ UTC mà lệnh di chuyển được thực thi và <Tên> là đối số bạn đã cung cấp trong lệnh console.

Phương thức up () được gọi khi bạn nâng cấp cơ sở dữ liệu của mình, trong khi phương thức down () được gọi khi bạn hạ cấp nó.

Step 2 - Để thêm một bảng mới vào cơ sở dữ liệu, hãy sửa đổi tệp di chuyển theo cách này.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_102634_add_news_table extends Migration {
      public function up() {
         $this->createTable("news", [ "id" => Schema::TYPE_PK, "title" => Schema::TYPE_STRING, "content" => Schema::TYPE_TEXT, ]); } public function down() { $this->dropTable('news');
      }
      /*
      // Use safeUp/safeDown to run migration code within a transaction
      public function safeUp() {
	
      }
      public function safeDown() {

      }
      */
   }
?>

Trong đoạn mã trên, chúng tôi đã tạo một bảng mới có tên là tin tức trong up() và bỏ bảng này trong down() phương pháp.

Các newsbảng bao gồm ba trường: id, tiêu đề và nội dung. Khi tạo một bảng hoặc một cột, chúng ta nên sử dụng các kiểu trừu tượng để việc di chuyển độc lập với một kiểu cơ sở dữ liệu. Ví dụ, trong trường hợp của MySQL, TYPE_PK sẽ được chuyển đổi thành int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.

Step 3 - Để nâng cấp cơ sở dữ liệu, hãy chạy lệnh này.

./yii migrate

Lệnh trên sẽ liệt kê tất cả các di chuyển có sẵn chưa được áp dụng. Sau đó, nếu bạn xác nhận áp dụng di chuyển, nó sẽ chạy safeUp () hoặc up () trong tất cả các lớp di chuyển mới.

Step 4 - Chỉ áp dụng ba lần di chuyển có sẵn, bạn có thể chạy.

./yii migrate 3

Step 5 - Bạn cũng có thể xác định một quá trình di chuyển cụ thể mà cơ sở dữ liệu sẽ được di chuyển đến.

# sử dụng dấu thời gian để chỉ định di chuyển

yii migrate/to 160202_195501

# sử dụng một chuỗi có thể được phân tích cú pháp bởi strtotime ()

yii migrate/to "2016-01-01 19:55:01"

# sử dụng tên đầy đủ

yii migrate/to m160202_195501_create_news_table

# sử dụng dấu thời gian UNIX

yii migrate/to 1393964718

Step 6 - Để hoàn nguyên một chuyển đổi (thực thi các phương thức down () hoặc safeDown ()), hãy chạy.

./yii migrate/down

Step 7 - Để hoàn nguyên năm lần di chuyển được áp dụng gần đây nhất, bạn có thể chạy.

./yii migrate/down 5

Step 8 - Để thực hiện lại (hoàn nguyên và sau đó áp dụng lại) di chuyển, hãy chạy.

./yii migrate/redo

Để liệt kê các di chuyển đã được áp dụng, hãy sử dụng các lệnh sau:

  • yii migrate/new # hiển thị 10 lần di chuyển mới đầu tiên

  • yii migrate/new 3 # hiển thị 3 lần di chuyển mới đầu tiên

  • yii migrate/new all # hiển thị tất cả các lần di chuyển mới

  • yii migrate/history # hiển thị 10 lần di chuyển được áp dụng gần đây nhất

  • yii migrate/history 20 # hiển thị 20 lần di chuyển được áp dụng cuối cùng

  • yii migrate/history all # hiển thị tất cả các lần di chuyển đã áp dụng

Đôi khi bạn cần thêm hoặc bớt một cột từ một bảng cụ thể. Bạn có thể dùngaddColumn()dropColumn() các phương pháp.

Step 1 - Tạo một cuộc di chuyển mới.

./yii migrate/create add_category_to_news

Step 2 - Sửa đổi tệp di chuyển mới được tạo theo cách này.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_110909_add_category_to_news extends Migration {
      public function up() {
         $this->addColumn('news', 'category', $this->integer());
      }
      public function down() {
         $this->dropColumn('news', 'category');
      }
   }
?>

Bây giờ, nếu bạn chạy ./yii migrate, cột thể loại sẽ được thêm vào bảng tin tức. Ngược lại, nếu bạn chạy./yii migrate/down 1, cột danh mục sẽ bị loại bỏ.

Khi thực hiện di chuyển DB, điều quan trọng là phải đảm bảo mỗi di chuyển đã thành công hoặc không thành công. Bạn nên bao gồm các hoạt động DB trong một giao dịch. Để triển khai di chuyển giao dịch, bạn chỉ nên đặt mã di chuyển trongsafeUp()safeDown()các phương pháp. Nếu bất kỳ thao tác nào trong các phương pháp này không thành công, tất cả các thao tác trước đó sẽ được khôi phục lại.

Ví dụ trước trong "cách giao dịch" sẽ là -

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_110909_add_category_to_news extends Migration {
      public function safeUp() {
         $this->addColumn('news', 'category', $this->integer()); } public function safeDown() { $this->dropColumn('news', 'category');
      }
   }
?>

Các yii\db\Migration lớp cung cấp các phương thức sau để thao tác cơ sở dữ liệu:

  • execute() - Thực thi một câu lệnh SQL thô

  • createTable() - Tạo bảng

  • renameTable() - Đổi tên bảng

  • insert() - Chèn một hàng duy nhất

  • batchInsert() - Chèn nhiều hàng

  • update() - Cập nhật hàng

  • delete() - Xóa hàng

  • addColumn() - Thêm một cột

  • renameColumn() - Đổi tên một cột

  • dropColumn() - Loại bỏ một cột

  • alterColumn() - Làm thay đổi một cột

  • dropTable() - Loại bỏ một bảng

  • truncateTable() - Loại bỏ tất cả các hàng trong bảng

  • createIndex() - Tạo chỉ mục

  • dropIndex() - Loại bỏ một chỉ mục

  • addPrimaryKey() - Thêm khóa chính

  • dropPrimaryKey() - Xóa khóa chính

  • addForeignKey() - Thêm khóa ngoại

  • dropForeignKey() - Xóa khóa ngoại