1
我需要運行一些SQL腳本到我的數據庫來更新模式和數據(某種遷移)。使用PHP/PDO運行SQL腳本到PostgreSQL
因爲在運行每個腳本之前需要檢查一些邏輯,所以我正在寫一個小的PHP工具來執行腳本,但是我有一個簡單的問題:我可以加載並執行一個「簡單」SQL腳本(包括表操作,直接觸發&存儲過程更新),還是應該向腳本添加標記(以標記每個句子的結束位置),並逐句運行腳本?
對於數據庫訪問,我正在使用PDO。
我需要運行一些SQL腳本到我的數據庫來更新模式和數據(某種遷移)。使用PHP/PDO運行SQL腳本到PostgreSQL
因爲在運行每個腳本之前需要檢查一些邏輯,所以我正在寫一個小的PHP工具來執行腳本,但是我有一個簡單的問題:我可以加載並執行一個「簡單」SQL腳本(包括表操作,直接觸發&存儲過程更新),還是應該向腳本添加標記(以標記每個句子的結束位置),並逐句運行腳本?
對於數據庫訪問,我正在使用PDO。
今天我有類似的情況。
我的解決方案是非常簡單的,但僅僅是足夠聰明,允許徵求意見和跨多行的語句。
// open script file
$scriptfile = fopen($script_path, "r");
if (!$scriptfile) { die("ERROR: Couldn't open {$scriptfile}.\n"); }
// grab each line of file, skipping comments and blank lines
$script = '';
while (($line = fgets($scriptfile)) !== false) {
$line = trim($line);
if(preg_match("/^#|^--|^$/", $line)){ continue; }
$script .= $line;
}
// explode script by semicolon and run each statement
$statements = explode(';', $script);
foreach($statements as $sql){
if($sql === '') { continue; }
$query = $pdo->prepare($sql);
$query->execute();
if($query->errorCode() !== '00000'){ die("ERROR: SQL error code: ".$query->errorCode()."\n"); }
}
這很有趣,但有一個問題:如果有觸發器或存儲過程,在哪裏可以更改分隔符並使用另一個字符而不是分號呢?那麼如果更新或插入語句中有分號呢?我會看看Joomla的源代碼,看看他們安裝的組件...... – mHouses 2015-06-30 06:01:14
當好如何管理SQL腳本是,Joomla使用類似於你:https://github.com/joomla/joomla-cms/blob/c41fcf023012741e230acac6acbe956f5c275c41 /libraries/joomla/database/driver.php#L338。 – mHouses 2015-06-30 06:40:36
是的,我的腳本絕對假定你已經自己編寫了SQL語句,並且可以防止邊緣情況。否則,你會做*真正的*解析和這樣一個簡單的腳本將*不夠*。我會一直比較喜歡簡單的解決方案,當它完成這項工作時。 – DaveGauer 2015-06-30 17:37:17