PHP單獨使用phinx使用數據庫遷移

可以獨立使用的遷移包對比后,感覺phinx更接近PHP的使用習慣。

為什么要單獨用?

因為我不想數據庫的遷移文件依賴于某種框架。本來是可以在框架里直接安裝這個包的,但是發現這個包依賴cakephp,而cakephp的函數與thinkphp的env()函數沖突。

官方文檔:Phinx Documentation - 0.16

安裝

新建個空目錄,然后在這個目錄執行:

composer require robmorgan/phinx

安裝好后,在目錄vendor\bin中能找到文件:phinx.bat。

建議:將vendor\bin的路徑加入到系統變量path中,就可以直接用這個命令了。

命令

查看可用命令列表

phinx

查看可用命令的幫助,如:

phinx init --help

初始配置文件

phinx init E:\a\b

假設項目目錄為:E:\a\b\。在目錄下創建配置文件phinx.php和phinx.yml,建議使用.php的文件(因為不用額外裝包),刪除掉phinx.yml。項目目錄不是phinx的安裝目錄。

文件內容如下:

<?phpreturn
['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'
];

[path]?節可以指定遷移文件和種子文件所在的目錄,可以指定為數組,如:

'paths' => [

? ? ? ? 'migrations' => [

? ? ? ? ? ? '%%PHINX_CONFIG_DIR%%/db/migrations',

? ? ? ? ? ? 'd:/a/b'

? ? ? ? ],

? ? ? ? 'seeds' => '%%PHINX_CONFIG_DIR%%/db/seeds'

? ? ],

%%PHINX_CONFIG_DIR%% 變量是phinx的內置變量,是配置文件所在的目錄。

[environments]?節為數據庫環境配置:

default_migration_table:指定保存遷移記錄的表名,執行遷移時會生成以這個為表名的表,保存每次執行的記錄。

default_environment:默認使用的環境,development為開發環境,將development節下的數據庫配置好。

創建遷移文件

phinx create SystemDict?--path=E:\a\b\db\migrations -c E:\a\b\phinx.php

phinx create 表名?--path=存放遷移文件的目錄 -c 配置文件路徑(即執行init時創建的文件)

將會在目錄中創建一個遷移文件,名稱類似于:20250830084537_system_dict.php。

如果用的是IDE打開文件,可以看到AbstractMigration是標紅的,這是因為phinx包不在項目目錄中。可以配置下IDE的PHP包含路徑:D:\soft\php\tools\vendor。

這是vscode的配置,我這里用的是Trae。

執行遷移

phinx migrate -c E:\a\b\phinx.php

將命令行的當前目錄切換為:E:\a\b\,可直接執行phinx migrate,不需要指定配置文件。

可以看到執行成功了,但是由于遷移文件是個空的,所以數據庫中沒有任何變化,只是多了一個表:phinxlog。這就是配置文件中指定的表名,非必要時不需要特意去改。表里有了一條記錄:

現在到遷移文件中添加表的定義:

<?phpdeclare(strict_types=1);use Phinx\Migration\AbstractMigration;final class SystemDict 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{// 定義表$table = $this->table('__table_prefix__system_dict', ['id' => false, 'primary_key' => ['id'], 'comment' => '系統字典']);// 定義表字段和索引$table->addColumn('id', 'biginteger', ['limit' => 20, 'null' => false, 'signed' => false, 'identity' => true, 'comment' => '主鍵'])->addColumn('create_time', 'datetime', ['comment' => '創建時間'])->addColumn('update_time', 'datetime', ['comment' => '更新時間'])->addColumn('code', 'string', ['limit' => 100, 'comment' => '字典編碼'])->addColumn('title', 'string', ['comment' => '字典標題,顯示名'])->addIndex('code', ['unique' => true, 'name' => 'idx_dict_code'])->create();}
}

現在再去執行遷移命令,發現什么都沒有變化。這是因為這個文件前一次已經執行過了,在phinxlog表中已經有了記錄。要再次執行這個文件,需要先回滾掉前一次執行的記錄。

為什么要在表定義設置 id=false?

phinx默認情況下會建一個名為id的int類型的主鍵字段,但有時候我們不想用int或是不想用id作為主鍵字段名。這時我們就要自已定義字段了。

回滾

phinx?rollback -c E:\a\b\phinx.php

加了代碼后執行,會得到一個錯誤:

這是因為之前執行時沒有建表,現在回滾導致找不到表。先將代碼中那表的代碼注釋掉,再執行回滾,回滾后再放開注釋掉的代碼。當然也可以手動刪除遷移表中的記錄,但不建議這么干。

每次執行回滾,只會回滾最后一次執行的遷移。如果想一次回滾多個記錄,可以用-t參數指定回滾到的版本,具體可以查看回滾的幫助。

phinx rollback -c E:\a\b\phinx.php ?-t 20250830084537 # 是回滾到這個版本(這個不會回滾,只回滾這個版本之后的所有版本)

phinx rollback -c E:\a\b\phinx.php ?-t 0 # -t 參數指定為0時,將回滾所有版本!!

回滾后再執行下遷移,可以看到表建好了:

查看回滾的幫助

phinx rollback --help

支持的字段類型

以下是各種數據庫都支持的類型

binary
boolean
char
date
datetime
decimal
float
double
smallinteger
integer
biginteger
string
text
time
timestamp
uuid

如果想用特殊類型,參考:Writing Migrations - 0.16,為了通用性,不建議使用特殊的類型。

問題

目前還沒有發現如何統一定義表前綴。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97385.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始學習單片機18

使用STM32CubeMX創建工程選擇對應芯片后創建工程&#xff0c;首先設置時鐘源內部時鐘源包括LSI&#xff08;低速時鐘&#xff09;和HSI&#xff08;高速時鐘&#xff09;&#xff0c;使用內部時鐘源就需要將圖中的一二處勾選HCLK是芯片運行時的評率&#xff0c;雖然下面標的最大…

如何使用 DeepSeek 幫助自己的工作?

技術文章大綱&#xff1a;利用 DeepSeek 提升工作效率 了解 DeepSeek 的基本功能 DeepSeek 的核心能力&#xff1a;文本生成、代碼輔助、數據分析支持的平臺與訪問方式&#xff08;網頁端/API/集成工具&#xff09;適用場景&#xff1a;技術文檔撰寫、自動化流程設計、數據處理…

計算機畢設javayit商城 基于SSM框架的校園二手交易全流程管理系統設計與實現 Java+MySQL的校園二手商品交易與供需對接平臺開發

計算機畢設 javayit 商城uwd1i9 &#xff08;配套有源碼 程序 mysql數據庫 論文&#xff09;本套源碼可以先看具體功能演示視頻領取&#xff0c;文末有聯xi 可分享隨著校園二手物品流通需求增長&#xff0c;傳統校園二手交易依賴線下擺攤、社群發布的模式&#xff0c;存在信息分…

Java函數式編程之【流(Stream)性能優化】

Java函數式編程之【流&#xff08;Stream&#xff09;性能優化一、流&#xff08;Stream&#xff09;性能優化的預備知識&#xff08;一&#xff09;并行與并發的區別&#xff08;二&#xff09;Stream操作特性分類&#xff08;三&#xff09;Stream流管道的相關知識二、流&…

Cybero: 1靶場滲透

Cybero: 1 來自 <Cybero: 1 ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168.23.139 3&#xff0c;對靶機進行端口服務探…

【學習筆記】非異步安全函數(禁止在信號處理中調用)

非異步安全函數&#xff08;禁止在信號處理中調用&#xff09; 一、測試 在信號處理函數&#xff08;Signal Handler&#xff09;中&#xff0c;只有異步信號安全函數&#xff08;async-signal-safe functions&#xff09; 可以安全調用。這類函數的特點是&#xff1a;不使用全…

【K8s】整體認識K8s之K8s的控制器

作用&#xff1a;控制器的作用就是持續監控k8s集群的狀態&#xff0c;讓它處于我們期望的狀態&#xff0c;常見的控制器有replicaset、deployment、daemonset、statefulset 、job 、cronjobReplicaset控制一組pod的副本數&#xff0c;始終與預設的值相同&#xff0c;會持續監視…

R ggplot2學習Nature子刊一張圖,換數據即可用!

本次使用R語言復現Nature Communications上的1張組合圖,這張圖兼具顏值+節約版面! Fig. 1 b原圖 ??復現效果圖-b圖?? ?讀入測試數據! ?關鍵代碼, # 關鍵代碼 library(ggplot2) library(dplyr) library(cowplot)# --- 外圈圖 --- p_outer <- ggplot(data_aug, aes…

迷你電腦用到什么型號的RJ45網口

迷你電腦常用的 RJ45 網口主要有標準 RJ45 網口和 Mini RJ45 網口兩種。標準 RJ45 網口是最常見的類型&#xff0c;遵循 IEEE 802.3i 標準&#xff0c;采用 8P8C&#xff08;8 Position 8 Contact&#xff0c;8 位 8 觸點&#xff09;連接器&#xff0c;有 T568A 和 T568B 兩種…

網絡安全 | 保護智能家居和企業IoT設備的安全策略

網絡安全 | 保護智能家居和企業IoT設備的安全策略 一、前言 二、智能家居和企業 IoT 設備面臨的安全威脅 2.1 設備自身安全缺陷 2.2 網絡通信安全隱患 2.3 數據隱私風險 2.4 惡意軟件和攻擊手段 三、保護智能家居和企業 IoT 設備的安全策略 3.1 設備安全設計與制造環節的考量 3…

優化器全指南:從原理到調優實戰

本文將帶你輕松理解深度學習中的“導航系統”——優化器。我們會避開復雜的數學公式,用大量的比喻和圖示,讓你徹底明白 Adam、AdamW、LAMB 是怎么回事,并學會如何調節它們的關鍵參數。 第一部分:核心概念:優化器是什么? 一個簡單的比喻: 想象你在一座大霧彌漫的山里(…

Notepad++使用技巧1

1.打開官方參考代碼經常看到下圖這種行尾很多空格的代碼&#xff0c;一點都不合符華為的書寫規范&#xff0c;閱讀起來容易讓人煩躁不安。初學者建議看看華為的代碼書寫規范&#xff0c;你將少走很多彎路&#xff0c;終生受益。2.快速去掉行尾很多空格方法點擊頂部菜單欄“宏”…

AIoT云邊協同方式

隨著物聯網&#xff08;IoT&#xff09;與人工智能&#xff08;AI&#xff09;的深度融合&#xff0c;AIoT&#xff08;人工智能物聯網&#xff09;作為一種新興技術范式&#xff0c;正在推動智能設備與產業的快速發展。AIoT通過云邊協同的方式&#xff0c;將邊緣側的IoT設備、…

MIT 6.5840 (Spring, 2024) 通關指南——Lab 1: MapReduce

MIT 6.5840 (Spring, 2024) – Lab 1: MapReduce &#x1f468;?&#x1f4bb; Charles &#x1f517; 實驗手冊&#xff1a; 6.5840 Lab 1: MapReduce &#x1f4c3; MapReduce 論文原文&#xff1a; mapreduce-osdi04.pdf ?? 本系列前文&#xff1a; MIT 6.5840 (Spring, …

吳恩達機器學習作業五:神經網絡正向傳播

數據集在作業一正向傳播正向傳播&#xff08;Forward Propagation&#xff09;是神經網絡計算過程中的核心步驟&#xff0c;指的是將輸入數據通過神經網絡的各層依次傳遞&#xff0c;最終得到輸出結果的過程。核心原理在神經網絡中&#xff0c;信息從輸入層流入&#xff0c;經過…

網絡編程(4)

【0】復習 sockfdsocket(); //指定網絡信息 bind(); listen(); //創建表 fd_set rfds,tempfds; FD_ZERO(); FD_SET(sockfd); max sockfd while(1) {tempfdsrfds;select(max1,&tempfds)if(FD_ISSET(scokfd,&tempfds)){acceptfdaccept();FD_SET(acceptfd,&rfds);if(m…

Windows系統提示“找不到文件‘javaw‘”

1. Java 未安裝或安裝不完整javaw.exe 是 Java 運行環境&#xff08;JRE&#xff09;的核心文件&#xff0c;用于運行 Java 程序&#xff08;如.jar 文件&#xff09;。如果你的電腦沒有安裝 Java&#xff0c;或安裝過程中 javaw.exe 被誤刪&#xff0c;系統就會找不到它。2. J…

【PCIE系列】1---PCIE系統拓撲結構分析

架構由點對點鏈路&#xff08;Links&#xff09;組成&#xff0c;用于互連組成系統的一系列組件。下圖展示了一個示例拓撲結構。該圖描述了一個有層次的體系架構實例&#xff0c;其包含根復合體&#xff08;Root Complex, RC&#xff09;、多個端點&#xff08;I/O設備&#xf…

SpringBoot防止重復提交(2)

例如&#xff1a;多次點擊提現按鈕問題描述&#xff1a;在提現操作中&#xff0c;用戶可能會多次點擊提現按鈕&#xff0c;導致多個相同的請求發送到服務器&#xff0c;從而引發重復提現的問題。為了解決這一問題&#xff0c;必須保證每個提現請求只能執行一次&#xff0c;防止…

mysql zip包安裝步驟

下載地址 windows MSI Install 安裝包程序。 這里下載zip包&#xff0c;執行安裝過程 確認my.ini 配置的路徑&#xff0c;創建mysql數據服務的data目錄管理員身份cmd 進入bin目錄&#xff0c;開始初始化服務 mysqld --initialize-insecure --usermysql mysqld -install#啟動…