2014-09-22 91 views
1

我需要運行一些SQL腳本到我的數據庫來更新模式和數據(某種遷移)。使用PHP/PDO運行SQL腳本到PostgreSQL

因爲在運行每個腳本之前需要檢查一些邏輯,所以我正在寫一個小的PHP工具來執行腳本,但是我有一個簡單的問題:我可以加載並執行一個「簡單」SQL腳本(包括表操作,直接觸發&存儲過程更新),還是應該向腳本添加標記(以標記每個句子的結束位置),並逐句運行腳本?

對於數據庫訪問,我正在使用PDO。

回答

1

今天我有類似的情況。

我的解決方案是非常簡單的,但僅僅是足夠聰明,允許徵求意見和跨多行的語句。

// 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"); } 
} 
+0

這很有趣,但有一個問題:如果有觸發器或存儲過程,在哪裏可以更改分隔符並使用另一個字符而不是分號呢?那麼如果更新或插入語句中有分號呢?我會看看Joomla的源代碼,看看他們安裝的組件...... – mHouses 2015-06-30 06:01:14

+0

當好如何管理SQL腳本是,Joomla使用類似於你:https://github.com/joomla/joomla-cms/blob/c41fcf023012741e230acac6acbe956f5c275c41 /libraries/joomla/database/driver.php#L338。 – mHouses 2015-06-30 06:40:36

+1

是的,我的腳本絕對假定你已經自己編寫了SQL語句,並且可以防止邊緣情況。否則,你會做*真正的*解析和這樣一個簡單的腳本將*不夠*。我會一直比較喜歡簡單的解決方案,當它完成這項工作時。 – DaveGauer 2015-06-30 17:37:17