Tôi có một "Schema" đối tượng mà tôi sử dụng - nhưng bạn có thể làm như vậy mà không cần lớp ..
Những gì bạn muốn làm là tạo ra một 'db_schema_versions
' bảng:
CREATE TABLE db_schema_versions (
`table` varchar(255) NOT NULL PRIMARY KEY,
`version` INT NOT NULL
)
Sau cơ sở dữ liệu của bạn có thể theo dõi phiên bản nào đang bật - nó có thể tự động nâng cấp SQL.
Bạn nên khóa bảng lược đồ trong khi nâng cấp giản đồ. Bằng cách này bạn sẽ không có hai yêu cầu tại cùng một thời điểm cố gắng để nâng cấp lược đồ của bạn.
Vì vậy, - theo dõi các phiên bản bạn đang nâng cấp từ - xây dựng một công tắc lớn - một cái gì đó như thế này:
class SNTrack_Db_Schema extends MW_Db_Schema_Abstract {
protected $table = "sntrack_db_schema";
protected $version = 5;
protected function upgrade($fromVersion) {
// don't break
switch($fromVersion) {
case 0:
$this->db->query('CREATE TABLE sntrack_inbound_shipment (
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`from` VARCHAR(255) NOT NULL,
`date` DATE NOT NULL,
`invoice` VARCHAR(255) NOT NULL,
`notes` TEXT
)');
$this->setVersion(1);
case 1:
$this->db->query('ALTER TABLE sntrack_details ADD `shipment_id` INT');
$this->db->query('ALTER TABLE sntrack_product ADD `inventory` INT NOT NULL DEFAULT 0');
$this->db->query('CREATE TABLE sntrack_inventory_shipment (
`shipment_id` INT NOT NULL,
`product_id` INT NOT NULL,
`qty` INT NOT NULL,
PRIMARY KEY (`shipment_id`, `product_id`)
)');
$this->setVersion(2);
...etc
nếu người dùng nâng cấp từ phiên bản 2 lên phiên bản 6. Bạn có lặp lại từng phiên bản 2-6 và chạy từng SQL trong chuyển đổi 2,3,4,5 và 6 để mỗi nâng cấp trong chuyển đổi chỉ là sql để nâng cấp từ phiên bản trước? – JasonDavis