使用PHP/PDO将SQL脚本运行到PostgreSQL
我需要对数据库运行一些SQL脚本,以更新模式和数据(某种迁移) 因为在运行每个脚本之前需要检查一些逻辑,所以我正在编写一个小型PHP工具来执行脚本,但我有一个简单的问题:我可以直接加载并执行一个“简单”的SQL脚本(包括表操作、触发器和存储过程更新),还是应该在脚本中添加标记(以标记每个句子的结尾),然后一句一句地写剧本使用PHP/PDO将SQL脚本运行到PostgreSQL,php,sql,postgresql,pdo,Php,Sql,Postgresql,Pdo,我需要对数据库运行一些SQL脚本,以更新模式和数据(某种迁移) 因为在运行每个脚本之前需要检查一些逻辑,所以我正在编写一个小型PHP工具来执行脚本,但我有一个简单的问题:我可以直接加载并执行一个“简单”的SQL脚本(包括表操作、触发器和存储过程更新),还是应该在脚本中添加标记(以标记每个句子的结尾),然后一句一句地写剧本 对于数据库访问,我使用PDO。我今天遇到了类似的情况 我的解决方案非常简单,但足够聪明,可以允许跨多行的注释和语句 // open script file $scriptfi
对于数据库访问,我使用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"); }
}
这很有趣,但有一个问题:如果存在触发器或存储过程,您可以更改分隔符并使用另一个字符而不是分号,该怎么办?如果update或insert语句中有分号呢?我将看一看Joomla的源代码,看看他们在安装组件时是如何管理sql脚本的……好吧,Joomla使用了类似于您的东西:。是的,我的脚本肯定假设您自己编写了sql语句,并且可以防止边缘情况。否则,您将进行真正的解析,像这样的简单脚本是不够的。我总是喜欢简单的解决方案。