Xây dựng các ứng dụng web hiện đại thường liên quan đến rất nhiều dữ liệu. Quản lý những dữ liệu này (cơ sở dữ liệu) trong quá trình phát triển và sản xuất có thể rất nhiều.
Điều này đặc biệt đúng nếu có nhiều nhà phát triển và nhiều môi trường nơi các thay đổi phải được triển khai theo cách thủ công.
Di chuyển cơ sở dữ liệu giúp nhà phát triển quản lý những thay đổi này một cách dễ dàng, trên nhiều môi trường và nhà phát triển.
Bài viết này giải thích:
- Di chuyển cơ sở dữ liệu là gì.
- Cách bắt đầu di chuyển cơ sở dữ liệu trong PHP bằng Phinx.
- Cách quản lý các bảng trong cơ sở dữ liệu của bạn.
Bài viết này dành cho người đọc có kiến thức cơ bản về PHP. Nó sẽ giúp bạn học cách quản lý cơ sở dữ liệu của mình một cách dễ dàng (và tốt hơn).
Di chuyển cơ sở dữ liệu là gì?
Về cơ bản, quá trình di chuyển chứa các thay đổi mà bạn muốn thực hiện đối với cơ sở dữ liệu của mình. Những thay đổi này có thể là tạo hoặc xóa bảng, thêm hoặc xóa một số trường khỏi bảng, thay đổi loại cột, v.v.
Các tệp này giúp dễ dàng thực hiện những thay đổi tương tự này trên nhiều hệ thống vì bất kỳ ai có tệp đều có thể chạy chúng và cập nhật cơ sở dữ liệu của họ.
Vì vậy, trong một tình huống thực tế, một số nhà phát triển trong nhóm có thể thực hiện thay đổi đối với người dùng bảng cho phép giới tính trường để chấp nhận nhiều hơn mặc định Nam giới và nữ giới tùy chọn, có thể là một phần ba khác Tùy chọn.
Sau khi thực hiện thay đổi này, nhà phát triển sẽ tạo một quá trình di chuyển. Quá trình di chuyển này bao gồm các thay đổi mà họ đã thực hiện đối với cơ sở dữ liệu – trong trường hợp này là thay đổi đối với một cột trên bảng – và các nhà phát triển khác có thể dễ dàng chuyển thay đổi này sang cơ sở dữ liệu cục bộ của riêng họ bằng cách chạy quá trình di chuyển.
Di chuyển giống như kiểm soát phiên bản cho cơ sở dữ liệu của bạn, cho phép nhóm của bạn xác định và chia sẻ định nghĩa lược đồ cơ sở dữ liệu của ứng dụng. Nếu bạn đã từng phải yêu cầu đồng đội thêm một cột vào lược đồ cơ sở dữ liệu cục bộ của họ theo cách thủ công sau khi lấy các thay đổi của bạn từ kiểm soát nguồn, thì bạn đã gặp phải vấn đề mà việc di chuyển cơ sở dữ liệu giải quyết được. – ấu trùng
Nhiều khung web phổ biến đã được tích hợp sẵn hỗ trợ di chuyển. Nhưng trong bài viết này, chúng ta khám phá cách sử dụng di chuyển trong vanilla PHP.
Tìm hiểu thêm về di chuyển cơ sở dữ liệu tại đây.
Phinx là gì?
Phinx là một thư viện PHP giúp dễ dàng quản lý việc di chuyển cơ sở dữ liệu cho ứng dụng PHP của bạn. – Phinx
Phinx giúp bạn có thể dễ dàng quản lý quá trình di chuyển bất kể bạn có đang sử dụng khung công tác PHP hay không. Nó cũng rất dễ cài đặt (như chúng ta sẽ thấy ở phần sau).
Nó đi kèm với một vài lệnh để thực hiện các thao tác dễ dàng hơn. Nó hoàn toàn có thể tùy chỉnh (bạn có thể làm bất cứ điều gì bạn muốn với nó 🙃). Nó cũng hoạt động trong nhiều môi trường, nghĩa là bạn có thể thực hiện một số lần di chuyển sản xuất, di chuyển thử nghiệm và di chuyển nhà phát triển.
Cài đặt Phinx
Bạn có thể thêm Phinx vào bất kỳ dự án PHP nào bằng trình soạn thảo.
$ mkdir php-migrations
$ cd php-migrations
$ composer init
Lệnh đầu tiên tạo một thư mục trong thư mục hiện tại của bạn, php-migrations
, và lệnh thứ hai di chuyển vào đó. Lệnh cuối cùng bắt đầu một shell tương tác.
Làm theo lời nhắc, điền thông tin chi tiết theo yêu cầu (giá trị mặc định là được). Bạn có thể đặt mô tả dự án, tên tác giả (hoặc tên của người đóng góp), độ ổn định tối thiểu cho các phần phụ thuộc, loại dự án, giấy phép và xác định các phần phụ thuộc của bạn.
Khi bạn đến phần phụ thuộc, hãy cài đặt robmorgan/phinx
nhân sư gói dưới dạng phụ thuộc.
Chấp nhận các giá trị mặc định khác và tiến hành tạo composer.json
tập tin. Tệp được tạo sẽ trông như thế này hiện tại:
{
"name": "zubair/php-migrations",
"description": "A simple tutorial on how to use and manage migrations in PHP applications.",
"type": "project",
"require": {
"robmorgan/phinx": "^0.12.10"
},
"license": "ISC",
"autoload": {
"psr-4": {
"Zubs\\": "src/"
}
},
"authors": [
{
"name": "Zubs",
"email": "[email protected]"
}
]
}
Khởi tạo Phinx
Sau khi cài đặt Phinx, bạn cần khởi tạo nó. Bạn có thể làm điều này rất dễ dàng bằng cách sử dụng tệp nhị phân được cài đặt trong vendor
thư mục.
$ ./vendor/bin/phinx init
Thao tác này tạo tệp cấu hình của phinx dưới dạng tệp PHP. Nó cũng có thể được tạo dưới dạng tệp JSON. Tôi thích cấu hình JSON hơn, vì vậy tôi sẽ sử dụng định dạng JSON.
$ ./vendor/bin/phinx init --format=json
Đây là giao diện của tệp cấu hình mặc định:
{
"paths": {
"migrations": "%%PHINX_CONFIG_DIR%%/db/migrations",
"seeds": "%%PHINX_CONFIG_DIR%%/db/seeds"
},
"environments": {
"default_migration_table": "phinxlog",
"default_environment": "development",
"production": {
"adapter": "mysql",
"host": "localhost",
"name": "production_db",
"user": "root",
"pass": "",
"port": 3306,
"charset": "utf8"
},
"development": {
"adapter": "mysql",
"host": "localhost",
"name": "development_db",
"user": "root",
"pass": "",
"port": 3306,
"charset": "utf8"
},
"testing": {
"adapter": "mysql",
"host": "localhost",
"name": "testing_db",
"user": "root",
"pass": "",
"port": 3306,
"charset": "utf8"
}
},
"version_order": "creation"
}
Trong tệp cấu hình này, hãy chú ý cách Phinx mong đợi rằng bạn có một db/migrations
đường dẫn (dành cho việc di chuyển của bạn) theo mặc định. Bạn có thể thay đổi điều này nếu muốn, nhưng tôi nghĩ nó ổn và tôi sẽ giữ nó.
$ mkdir db && db/migrations
Bạn có thể đọc thêm về các cấu hình này trong tài liệu chính thức.
Phinx cũng cung cấp các lệnh cho các hành động khác nhau để giúp sử dụng dễ dàng hơn trong các dự án của chúng tôi.
Cách tạo Di chuyển
Phinx sử dụng các lớp để di chuyển. Để tạo một lần di chuyển mới (giả sử, một lần để tạo một bài viết bảng), hãy sử dụng create
lệnh với tên của di chuyển.
$ ./vendor/bin/phinx create PostsTableMigration

Điều này tạo ra một 20220328122134_posts_table_migration.php
tập tin trong db/migrations
thư mục đã tạo trước đó. Tập tin này được đặt tên bằng cách sử dụng YYYYMMDDHHMMSS_my_new_migration.php
định dạng. Ở định dạng này, 14 ký tự đầu tiên, YYYYMMDDHHMMSSlà các đại diện của dấu thời gian hiện tại.
Các
trông như thế này hiện tại:20220328122134_posts_table_migration.php
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
final class PostsTableMigration extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change(): void
{
}
}
Tệp này (và tất cả các lần di chuyển khác được tạo bằng Phinx) mở rộng Phinx\Migration\AbstractMigration
lớp. Lớp này có tất cả các phương thức bạn cần để tương tác với cơ sở dữ liệu của mình.
Tệp di chuyển này cũng bao gồm một change
phương pháp. Phương pháp này gần đây đã được giới thiệu cho Phinx trong phiên bản 0.2.0 để triển khai ý tưởng di chuyển có thể đảo ngược của Phinx.
Đây là những tệp di chuyển chỉ với một phương pháp, biến đổi, chứa logic để thực hiện một số hành động, để Phinx tìm ra cách đảo ngược nó. Thay vì sử dụng hai phương pháp truyền thống, hướng lên và xuốngđể tạo và đảo ngược hành động.
Phinx vẫn cho phép bạn sử dụng hướng lên và phương pháp xuống. Nhưng nó ưu tiên phương thức thay đổi hơn chúng khi chúng được sử dụng cùng nhau. Nó bỏ qua chúng.
Cách quản lý bảng
Các bảng là cơ sở để xây dựng cơ sở dữ liệu có cấu trúc và là phần quan trọng nhất trong những gì Phinx cung cấp.
Bạn có thể dễ dàng quản lý các bảng cơ sở dữ liệu bằng mã PHP với Phinx. Phinx cung cấp một mạnh mẽ table()
phương pháp. Phương thức này truy xuất một thể hiện của Cái bàn vật.
Cách tạo một bảng
Tạo một bảng thực sự dễ dàng bằng Phinx. Bạn tạo một phiên bản mới của Cái bàn đối tượng sử dụng table()
phương pháp với tên bảng.
$table = $this->table('posts');
Tiếp theo, bạn có thể thêm các cột với cài đặt của chúng.
$table->addColumn('title', 'string', ['limit' => 20])
->addColumn('body', 'text')
->addColumn('cover_image', 'string')
->addTimestamps()
->addIndex(['title'], ['unique' => true]);
Ở đây, tôi đã tạo các cột title
, body
, cover_image
, created_at
và updated_at
. Tôi cũng đặt loại title
trở thành một chuỗi với 20 ký tự trở xuống.
tôi đặt body
là một trường văn bản, vì vậy nó có thể chứa các bài viết dài. Các cover_image
cũng là một chuỗi trường sử dụng kích thước mặc định của một chuỗi (255).
Các created_at
và updated_at
các trường là dấu thời gian được tạo tự động trong addTimestamps()
phương pháp.
Cuối cùng, tôi đặt title
trường là duy nhất (giống như trong một blog thực sự).
Bạn có thể nhận được tất cả các loại cột có sẵn bằng cách kiểm tra Loại cột hợp lệ. Bạn cũng có thể nhận được tất cả các tùy chọn cột có sẵn bằng cách kiểm tra Tùy chọn cột hợp lệ.
Cuối cùng, bạn có thể nói rằng cơ sở dữ liệu nên được tạo bằng cách sử dụng create
phương pháp.
$table->create();
Cuối cùng, tệp di chuyển của bạn biến đổi phương pháp sẽ trông như thế này:
public function change(): void
{
$table = $this->table('posts');
$table->addColumn('title', 'string', ['limit' => 20])
->addColumn('body', 'text')
->addColumn('cover_image', 'string')
->addTimestamps()
->addIndex(['title'], ['unique' => true]);
$table->create();
}
Bây giờ chúng ta có thể chạy quá trình di chuyển này để tạo bảng của mình.
Cách chạy di chuyển
Sau khi tạo di chuyển, bước tiếp theo là thực thi những thay đổi mong muốn này trong cơ sở dữ liệu. Chạy di chuyển thực sự thực thi những thay đổi này.
$ ./vendor/bin/phinx migrate

Hình ảnh này cho thấy kết quả của việc di chuyển. Bạn có thể thấy thời gian cần thiết để chạy quá trình di chuyển.
Bây giờ, nếu bạn kiểm tra công cụ GUI cơ sở dữ liệu của mình, bạn sẽ nhận thấy rằng bài viết bảng đã được tạo với một trường bổ sung, Tôi cánh đồng. Trường này cũng là trường chính theo mặc định. Và nó cũng tự động tăng.

Bạn có thể thay đổi khóa chính thành một số khóa khác bằng cách chỉ định một số trường khác làm trường chính hoặc bằng cách ánh xạ Tôi trường thành trường chính mong muốn. Cái sau bao gồm khả năng tăng tự động của bình thường Tôi cánh đồng.
$table = $this->table('posts', [
'id' => false,
'primary_key' => ['posts_key']
]);
$table = $this->table('posts', [
'id' => 'posts_key',
]);
Trong phương pháp đầu tiên, khóa chính được sử dụng phải là một cột trên bảng (nó không được tạo tự động).
Bạn cũng có thể đặt môi trường mà bạn muốn chạy di chuyển.
$ ./vendor/bin/phinx migrate -e testing
Cách đảo ngược di chuyển
Di chuyển có thể được đảo ngược bằng cách chạy xuống. Đây là mặt trái của di cư hướng lên. Bảng đã tạo trước đó sẽ bị hủy, các cột được thêm vào sẽ bị xóa và cơ sở dữ liệu sẽ trở về trạng thái trước khi di chuyển ban đầu.
$ ./vendor/bin/phinx rollback

Cách kiểm tra trạng thái di chuyển
Khi kích thước ứng dụng của bạn tăng lên, dự kiến số lần di chuyển cơ sở dữ liệu của bạn sẽ tăng lên. Do đó, tại một số thời điểm, bạn có thể muốn kiểm tra trạng thái di chuyển của mình để biết cái nào đã được chạy và cái nào chưa.
$ ./vendor/bin/phinx status

Làm thế nào để thả một cái bàn
Bạn có thể dễ dàng sử dụng drop
phương pháp, tiếp theo là save
phương pháp để duy trì sự thay đổi, trên Cái bàn vật.
$this->table('posts')->drop()->save();
Cách đổi tên bảng
$table = $this->table('posts');
$table->rename('articles')
->update();
Để thả một bảng, lấy bảng. Sau đó sử dụng rename
phương pháp với tên mới, tiếp theo là update
phương pháp để duy trì sự thay đổi này.
Cách thay đổi khóa chính của bảng
Bạn cũng có thể dễ dàng thay đổi khóa chính của bảng.
$table = $this->table('posts');
$table->changePrimaryKey('new_primary_key');
$table->update();
Phần kết luận
Bây giờ bạn đã biết cách thiết lập di chuyển trong các ứng dụng PHP của mình.
Nếu bạn có bất kỳ câu hỏi hoặc lời khuyên có liên quan, xin vui lòng liên hệ với tôi để chia sẻ chúng.
Để đọc thêm các bài viết của tôi hoặc theo dõi công việc của tôi, bạn có thể kết nối với tôi trên LinkedIn, Twittervà Github. Thật nhanh chóng, thật dễ dàng và hoàn toàn miễn phí!