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() và 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() và 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