• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 將你的網站從MySQL改為PostgreSQL(下)

    發表于:2007-07-02來源:作者:點擊數: 標簽:
    在2001年六月,我將我的站點的后端 數據庫 從MySQL改為PostgreSQL。這僅僅花了我一天的時間。從那時起,Postgres一直工作得很正常,這證明我作出了正確的選擇。 在這篇文章的上半部分,我們講解了如何將數據從MySQL轉換到Postgres。我們還說明了我改用Postgr
        在2001年六月,我將我的站點的后端數據庫從MySQL改為PostgreSQL。這僅僅花了我一天的時間。從那時起,Postgres一直工作得很正常,這證明我作出了正確的選擇。
        在這篇文章的上半部分,我們講解了如何將數據從MySQL轉換到Postgres。我們還說明了我改用Postgres的理由。而在下半部分,我們將指導你完成另一半的轉換工作并講解如果將已編制好的用于MySQL的PHP代碼改用于Postgres。

    準備
        在你做這項工作之前,你需要一些準備工作。你的編程技巧和網站的復雜性將對程序的轉換影響很大。為了防止在工作中發生錯誤,在你的Web服務器上為你的站點作一份備份肯定是必要的。我當時的解決方法是設置了一個指定的子域來測試我正在修改的代碼。因為站點會根據一個配置文件中的一些基本配置自動處理URL,所以這件工作很簡單。你也許不能這樣做,但是不管怎樣,你都需要一個另外的空間來放置你正在改動的程序,這可以是一個子域、你的站點的一個子目錄、另一個Web主機也可以是一個本地的開發機器。
        注意:如果你在另一臺機器修改你的程序,你必須確保這個Web服務器的配置和你正在使用的站點一樣。如果你的Web主機只允許從本地連接Postgres,你也許將不得不將你的Postgres數據拷貝到開發機器上。要得到更多有關拷貝一個Postgres數據庫的信息,可以參看上的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>
    ...
        有了這樣一個前面這樣的中心配置文件,改變數據庫系統將變得非常簡單?,F在可以著手改程序了。

    連接和查詢
        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支持所有的通用的功能。
        現在你已經把連接和查詢的代碼改好了,下面的問題可能要稍微復雜一點。PHP中MySQL和Postgres對結果集處理的不同可能需要你對代碼作更多的變動。

    讓我們來看看對結果的處理
        PHP的Postgres對結果的處理并不完全和MySQL一一對應;它們有一些微小的不同。這些微小的差別可能只需要對代碼作微小的改動,但是也可能是一個挺復雜的問題。
        首先,讓我們看看MySQL和Postgres有哪些相似的地方。下面這個列表介紹了普通的MySQL結果處理函數和它們相對應的Postgres函數:

    MySQL
    mysql_num_rows($result) 返回結果集的行數,這僅對SELECT語句有效
    mysql_affected_rows($result) 返回在一個INSERT、UPDATE或DELETE查詢中受到影響的行數
    mysql_fetch_object($result) 取得一行的數據并將其作為一個對象返回。字段名對應于類的屬性名。(即$field1 = $var->field1;)這個函數保存了一個內部變量以保證每次調用時可以返回下一行。
    mysql_fetch_row($result) 這個函數以一個數組的形式返回結果集的一行。這個值可以通過一個從0開始的數組值獲得。(即$field1 = $var[0];)。同樣,這個函數保存了一個內部的計數器以保證每次調用時可以返回下一行。
    mysql_fetch_array($result) 這個函數和另外兩個fetch函數基本相同,只是它以一個聯合數組的形式返回一個行($field1 = $var["field1"];)。

    Postgres
    pg_numrows($result) 與對應的mysql_num_rows($result)完全一樣
    pg_cmdtuples($result) 與對應的mysql_affected_rows($result)完全一樣
    pg_fetch_object($result, $row) 獲得結果集中的指定行。必須使用$row</CODE>參數,而且沒有一個內部的計數器。除此之外,它與mysql_fetch_object($result)完全相同。
    pg_fetch_row($result, $row) 以一個數組的形式返回結果集中的指定行。同樣必須使用$row參數,而且沒有一個內部的計數器。
    pg_fetch_array($result, $row) 與對應的mysql_fetch_array($result)基本一樣,只是需要指定行,并且缺少一個內部的計數器。
    有關這些函數的更詳細的信息,請參看PHP.Net上的PHP文檔。
    PHP對MySQL和Postgres支持的最本質的不同在于對結果集的閱讀。MySQL自動決定獲取哪一行,而Postgres必須指定要閱讀哪一行。下面是一些例子,你也可能會遇到這些問題,對于它們有兩個解決方案。
    //第一個普通的例子:
    $rslt=mysql_query("SELECT * FROM blah", $connection_id);
    while($value=mysql_fetch_array($rslt))
    {
    //完成數據處理工作
    }
    //對于Postgres,這樣的代碼無法執行,因為他們需要指定行號
    //代碼將作如下改動(如果你沒有使用前面討論的函數):
    $rslt=pg_exec($connection_id, "SELECT * from blah");
    $limit=pg_numrows($rslt);
    for($rownum=0;$rownum<$limit;$rownum++)
    {
    $value=pg_fetch_array($rslt, $rownum);
    //完成處理工作
    }
        在上面的例子中,你可以注意到Postgres的代碼要稍微長一點,這是因為你必須指定行號。然而,如果你使用了你編寫的自己的計數函數,問題就變得很簡單了。這兒是一個添加了這樣一個函數的有用的文件。請注意在postg_query()中使用了三個全局變量。
    <?php
    // /usr/local/lib/php/mysite/configfile.php
    $hostname = "localhost";
    $username = "username";
    $database = "mydb";
    $password = "mypasswd";
    //內部計數變量
    $fetch_array_counter=0;
    $fetch_object_counter=0;
    $fetch_row_counter=0;
    //處理連接到PostgreSQL數據庫的函數
    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)
    {
    //將全局變量設置為0
    global $fetch_array_counter, $fetch_row_counter, $fetch_object_counter;
    $fetch_array_counter=$fetch_row_counter=$fetch_object_counter=0;
    return pg_exec($connection_id, $query);
    }
    //pg_fetch_array()置換
    function postg_fetch_array($rslt)
    {
    global $fetch_array_counter;
    $fetch_array_counter++;
    //計數器加一
    return pg_fetch_array($rslt, $fetch_array_counter);
    }
    //pg_fetch_row()置換
    function postg_fetch_row($rslt)
    {
    global $fetch_row_counter;
    $fetch_row_counter++;
    //計數器加一
    return pg_fetch_row($rslt, $fetch_row_counter);
    }
    //pg_fetch_object()置換
    function postg_fetch_object($rslt)
    {
    global $fetch_object_counter;
    $fetch_object_counter++;
    //計數器加一
    return pg_fetch_object($rslt, $fetch_object_counter);
    }
    ?>
        當然,如果你在同一個循環中同時對兩個結果集進行操作,上面的函數將無法正常地工作,因為它們只使用了一個內部的計數器。如果因為某種原因,你需要同時閱讀幾個結果集,你將不得不使用傳統的Postgres方法。
        另一個你可能遇到的問題是在Postgres中沒有與MySQL中mysql_insert_id()相應的函數,這個函數反映最后的INSERT查詢的索引值。PHP文檔往往會讓讀者誤以為pg_getlastoid()會完成這項工作,但是實際情況并不是這樣。缺少這一樣一個函數并不一個無法逾越的障礙,你可以利用Postgres的SEQUENCE系統來實現這樣的功能。
        幸運的是,要獲得最后的ID是相當容易的。你可以通過SQL獲得Sequence信息,因此你可以用這個語句來實現mysql_insert_id()的功能:
    function postg_insert_id($tablename, $fieldname)
    {
    global connection_id;
    $result=pg_exec($connection_id, "SELECT last_value FROM ${tablename}_
    ${fieldname}_seq");
    $seq_array=pg_fetch_row($result, 0);
    return $seq_array[0];
    }
        因為Postgres使用了一個特別的命名系統來命名序列,我上面建立的這個函數需要指定表名和字段名。調用這個函數,會返回你的表中的任意SERIAL字段的最后一個序列值,即使在表中有不止一個這樣的字段。
        經過上面的這些處理后,你已經可以在你的MySQL站點上成功地運行PostgreSQL了。然而,這僅僅是第一步;如果你想了解更多,繼續看下去,你會看到一些有用的PostgreSQL的資源。
    更進一步的資源
        從PostgreSQL非FAQ文檔站點你可以看到最初的和最重要的PostgreSQL資源。這個有價值的資源可以向你提供大量的書籍、參考、技術參考甚至于具體的工作。它同樣會涉及將后端數據庫從MySQL 改為Postgres,此外對于使用PostgreSQL的其它問題它也可以給你幫助。
        另一個有價值的PostgreSQL提供的資源是PostgreSQL交互文檔。其中涉及到使用PostgreSQL的很多問題。
        Xach Beane,因為其在The GIMP(一種圖形處理軟件)上的工作而著名,他也編寫了關于將MySQL dump轉換為Postgres dump的書寫一個腳本。他的程序可以更為全面地處理這些問題。不過,對這些問題的處理并不是十分完美的,因此你得小心地使用它。
        Dobrica Pavlinusic也編寫了一個程序以處理從MySQL到Postgres的轉換。同樣得提醒你這個程序的處理仍然不是十分完美的,因此還是少不了象我們上面所討論的手工的修改。
    從這兒你可以找到一個非常完全的PostgreSQL&PHP指南。它會從安裝開始介紹PostgreSQL的使用。這個指南非常值得初學者閱讀。
        Bruce Momjohan編寫了一本關于PostgreSQL的名為PostgreSQL: Introduction and Concepts的書,已由Addison Wesley出版。你甚至還可以在線閱讀!
        最后,OpenDocs也出版了實用PostgreSQL。這本書在2001年十月份出版,你可以從the OpenDocs Linuxports.com站點閱讀。
        將你的站點的后端數據庫從MySQL改為PostgreSQL是一個明智的選擇。轉換工作肯定會耗費時間和精力,但是經過這些努力后,你的站點可以擁有一個更完美的數據庫系統。就象我一樣,你也會覺得這項工作是有意義的!

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>