Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

将你的网站从MySQL改为PostgreSQL(下)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  在2001年六月,我将我的站点的后端数据库从MySQL改为PostgreSQL。这仅仅花了我一天的时间。从那时起,Postgres一直工作得很正常,这证明我作出了正确的选择。

  在这篇文章的上半部分,我们讲解了如何将数据从MySQL转换到Postgres。我们还说明了我改用Postgres的理由。而在下半部分,我们将指导你完成另一半的转换工作并讲解如果将已编制好的用于MySQL的PHP代码改用于Postgres。

准备

  在你做这项工作之前,你需要一些准备工作。你的编程技巧和网站的复杂性将对程序的转换影响很大。为了防止在工作中发生错误,在你的Web服务器上为你的站点作一份备份肯定是必要的。我当时的解决方法是设置了一个指定的子域来测试我正在修改的代码。因为站点会根据一个配置文件中的一些基本配置自动处理URL,所以这件工作很简单。你也许不能这样做,但是不管怎样,你都需要一个另外的空间来放置你正在改动的程序,这可以是一个子域、你的站点的一个子目录、另一个Web主机也可以是一个本地的开发机器。

  注意:如果你在另一台机器修改你的程序,你必须确保这个Web服务器的配置和你正在使用的站点一样。如果你的Web主机只允许从本地连接Postgres,你也许将不得不将你的Postgres数据拷贝到开发机器上。要得到更多有关拷贝一个Postgres数据库的信息,可以参看http://www.postgresql.org/上的pg_dump和pg_restore。

  做好了拷贝并且经过测试它可以正常工作之后,你可以着手对程序进行解剖了。

PHP手术:代码解剖

  如何你之前没有一个中心的配置文件,那么首先建立它。这将减轻我们的很多工作量,而且也使得我们的改动可以即时对整个站点发生作用。这个配置文件也该是不允许其它人通过网站访问的,否则这将是一个安全隐患。PHP的默认包含目录是/usr/local/lib/php/。你需要在你的Web主机上建立这样一个目录并不允许通过网站访问。你还得确保这对于使用同一Web主机的其他人也无法读取这个目录。如果你的站点和我的一样,包含了一个标准的头文件,你可以将你的Postgres设置文件放在那儿,这个配置文件将会是这样的:</P>


<?php
// /usr/local/lib/php/mysite/configfile.php
$hostname = "localhost";
$username = "username";
$database = "mydb";
$password = "mypasswd";
?>
<?php
//标准的HTML头
include("mysite/configfile.php");
?>
<html>
<head>
<title>Bill's Kazoos</title>
...
</head>
<body>
...

  有了这样一个前面这样的中心配置文件,改变数据库系统将变得非常简单。现在可以着手改程序了。

连接和查询

  PHP有关MySQL的函数和Postgres很相似,所以转换代码的工作并不是太复杂。事实上,你可以自己写一些函数来完成这种转换。在做这项工作之前,让我们来看看两者的不同:

  要连接到MySQL数据库需要用到两个命令:


$connection_id=mysql_connect($hostname, $username, $password);
mysql_select_db($database, $connection_id);

  如果你使用一个持久的连接:


$connection_id=mysql_pconnect($hostname, $username, $password);
mysql_select_db($database, $connection_id);

  然而,PHP连接Postgres的函数只需要一个字符串参数,与MySQL函数不同,这是一个复合的字符串参数。Postgres函数也需要你指定使用的数据库。下面是一个示例:


$connection_id=pg_connect("host=$hostname dbname=$database user=$username 
  password=$password");

  一个持久的连接执行同样的工作,只是需要调用pg_pconnect()函数。

  PHP的MySQL和Postgres的查询函数同样有点不同。MySQL的查询函数是$result_data = mysql_query("query goes here",$connection_id);,而Postgres的查询函数是这样的:$result_data = pg_exec($connection_id, "query goes here")。

  正如你所看到的,PHP对MySQL和Postgres和连接和查询的支持区别并不大,但是函数参数的不同还是需要我们慢慢处理。要提高速度,你可以写一些函数使得Postgres可以使用和MySQL一样的函数来连接。如果你有了包含这样一种函数的中心库,你可以将这些函数也放在那里。你也可以将它们放置在我们前面所提到的配置文件中,因为它会自动地被每个页面包含。

  //连接到数据库


function postg_connect($hostname, $username, $password, $database)
  {
  return pg_connect("host=$hostname dbname=$database
 user=$username password=$password");
  }

  //如果你仅仅使用一个数据库,你最好将这些变量放到你的配置文件中


function postg_autoconnect()
  {
   global $hostname, $username $password $database;
   return pg_connect("host=$hostname dbname=$database
  user=$username password=$password");
  }
//查询函数
function postg_query($query, $connection_id)
  {
   return pg_exec($connection_id, $query);
  }

  不管你是否使用这种函数,代码转换的工作总是相当简单的。Postgres几乎可以支持所有的以前在MySQL下使用的SQL查询,但是你可能还是要整理一下你的查询。因为在不同的地方数据模型和代码会有一些不同,我在这里不想详细解释这个问题。然而,对SQL的转换并不困难。首先转换代码,然后看看有哪些查询无法在Postgres中正常执行。对MySQL语言指南和PostgreSQL用户向导中的相关问题进行比较,你也许不能在Postgres中找到所有与MySQL同等的功能,但是Postgres支持所有的通用的功能。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:一个网上理财站点的设计(十七)   下一篇:PostgreSQL 6 综述

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号