在本書的這部分中,我們將討論編寫自己的訪問MySQL數據庫的程序所需要知道的內容。MySQL有一組實用程序。例如, mysqldump 導出表的上下文和結構定義, mysqlimport將數據文件加載到表中, mysqladmin 實現管理w操作, mysql可以使用戶與服務器交互來執行任意的查詢。每個標准的MySQL實用程序都傾向於小巧,重點放在程序可完成特定的、有限的功能。即使mysql也是如此,從感覺上說, mysql比其他實用程序更靈活,因此可以用它來執行任何數量的各種查詢,即它就是為允許向服務器直接發布SQL 查詢,並可查看查詢結果這一單一目的而設計的。
MySQL客戶機這種有限的特性並不是缺點,而是特意設計的。程序是具有通用目的的實用程序;它們並不試圖預料您所想做的所有可能的需要。MySQL的開發者們不贊成編寫大型的、臃腫的程序來試圖做可能想去做的每件事情(而且這樣做的結果將使程序中包括大量的
您根本不關心的事情的代碼)。然而,有時有些應用確實有常規客戶機的能力所無法處理的需求。為了處理這些情況,MySQL提供一個客戶機編程庫。這允許您編寫自己的程序,滿足您的應用程序可能具有的任何特定需求。通過允許您對MySQL服務器的訪問,客戶機的開放
程度只受您自己想象力的限制了。
編寫自己的程序可以獲取如何特殊的能力呢?讓我們比較一下mysql客戶機和其沒有附加代碼的接口對MySQL服務器的訪問:
■ 可以定制輸入處理。用mysql可以輸入原始的SQL 語句。用自己的程序,可以為用戶提供使用起來更直觀、更容易的輸入方法。用程序可使用戶不必知道SQL—甚至不必知道在完成的任務中數據庫承擔的角色。
輸入信息的采集可能是像命令行風格的提示和值讀取這樣基本的方式,或者可能是使用屏幕管理程序包(如curses 或S - L a n g)、使用Tcl/Tk 的X 窗口或Web 浏覽器格式實現的基於屏幕輸入那樣復雜的方式。
對大多數人來說,通過填寫一定的格式來指定搜索參數的形式比通過發布SELECT語句更容易。例如,一位房地產經紀人,要尋找一定價格范圍、風格或位置的房屋,只要將查尋參數輸入到表格中,就可以最小的代價得到符合條件的內容。輸入新記錄或更新已有記錄也類似地考慮這種應用。在數據輸入部門的鍵盤操作員應該不需要知道像INSERT、REPLACE 或UPDATE 這樣的SQL 語法。
在最終用戶和MySQL服務器之間提出輸入采集層的另一個原因是可以校驗用戶提供的輸入。例如,可以檢查數據,確認它們是符合MySQL要求的格式,或可以要求填寫特定的區域。
■ 可以定制輸出。mysql的輸出基本上是無格式的;可以選擇以制表符為分隔符或以表格形式輸出。如果想要使輸出結果看起來比較好,則必須自己對它進行格式化。這些需求可能像打印“Missing”而不是NULL 這樣簡單,也可能更復雜。考慮下面的報告:
這個報告包括幾個特定的元素:
■ 定制標題。
■ 在State 列中重復值的抑制以便只在更改時才將這些值打印出來。
■ 小計和總計的計算。
■ 數字格式,如9 4 3 8 4 . 2 4,打印為美元數量為$ 9 4 , 3 8 4 . 2 4。對於一些任務,甚至可能不需要任何輸出。您可能正在對計算向後插入到另一個數據庫表中的結果進行簡單地檢索信息。除了用戶運行這個查詢以外,甚至可能還想將這個結果輸出到其他地方。例如,如果正在提取姓名和電子郵件地址以自動地填入為批量電子郵件生成信件格式的過程中,則程序產生輸出。但是該輸出由郵件接受者的信息組成,而沒有運行程序人員的信息。
■ 可以在SQL自身施加的約束條件的環境下工作。SQL 不是一種帶有條件選擇、循環和子例程的流程控制結構的過程語言。SQL 腳本包括一組從開始到結束一次一個的可執行語句,具有最低限度的錯誤檢查。
如果在批處理模式中使用mysql執行SQL 查詢的一個文件,則mysql在出現第一個錯誤後退出,或者,如果指定--force 選項,則不管出現多少錯誤,都不加選擇地執行所有查詢。程序可以圍繞語句提供流程控制,以便可以有選擇地適應查詢的成功或失敗。可以根據另一個查詢的成功或失敗來執行一個查詢,或根據前一個查詢的結果來決定下一步要做的事情。SQL 具有非常有限的語句間的連續性,這點也被帶到mysql中。使用一個查詢的結果,並將它們應用於另一個查詢中,或將多個查詢結果聯系在一起是困難的。L A S T _ INSERT _ID() 可用於獲取由前一個語句最新生成的AUTO_INCREMENT 值,僅僅是關於它的。
更一般的情況是,要想檢索一組記錄,然後使用每一條記錄作為一系列復雜的進一步操作的基礎是困難的。例如,檢索一個消費者列表然後查詢每個消費者的詳細信用歷史,對每個客戶來說可能要包括若干個查詢。在某些情況下,可能想開發票,在發票頭寫上需要聯系的客戶信息,然後按次序列出每項條目。mysql不適合這些類型的任務,因為可能需要依賴於前幾個查詢結果的若干查詢,並且這些任務超出了mysql的布局設計的能力。一般來說,除了mysql外,還需要工具來執行包括主-細目關系和具有復雜輸出格式需求的任務。程序提供將查詢連接在一起的“膠”,並可用一個查詢的輸出作為另一個查詢的輸入。
■ 可以將MySQL集成到任何應用程序中。許多程序都利用數據庫的能力提供信息。通過發布一個快速查詢,應用程序可以校驗消費者號或檢查一項條目是否在產品清單中。假設一個客戶要尋找某些作者的所有書,則Web 應用程序可以在數據庫中查找它們,
然後將結果顯示在該客戶的浏覽器上。
通過使用調用帶有包含SQL 語句的輸入文件的mysql的外殼腳本( shell script),可以實現一種初步的“集成”,然後,再使用其他UNIX實用程序加工這些輸出。但是這可能變得很難看,特別是當任務變得更復雜時。當應用程序不斷增長成為雜亂的修補工作時,它也可能產生一種“在工作,但覺得有錯誤”的感覺。此外,運行其他命令的外殼腳本的創建過程的開銷可能超過您的預想。但它可能更有效率地與MySQL服務器直接交互,當在應用程序執行的每個階段需要它的時候,都可以精確地提取想要的信息。針對我們在第1章“MySQL和SQL 介紹”中安裝的樣例數據庫samp_db,我們已經列舉了若干需要自己編寫與MySQL服務器交互的程序的目標。這些目標中的一些顯示在下面的列表中:
■ 為打印而格式化Historical League 目錄。
■ 考慮外觀和聯機目錄的尋找。
■ 通過電子郵件向成員發送補充通知。
■ 使用Web 浏覽器很容易地將分數輸入到學分冊中。
在一些細節方面,我們將考慮的一個方面是將MySQL的能力與Web 環境結合起來。MySQL不直接提供對Web 應用程序的支持,但通過組合帶有適當的工具的MySQL,通過We b可以很容易地訪問數據庫。使用Web 服務器可以指定查詢,向客戶的浏覽器報告結果。將MySQL和Web 結合可能有兩個想法:
■ 主要的興趣在於數據庫,只是想使用Web 作為工具來獲取對數據更容易的訪問。在這樣的想法下,數據庫的位置是清楚且明顯的,因為它是興趣的焦點。例如,可以編寫Web 頁來允許查看數據庫所包含的表、表的結構,及表的內容。您打算使用Web 服務器來提高對MySQL的訪問能力。這可能也是MySQL管理者的觀點。
■ 主要的興趣可能是Web 站點,為了使站點的內容對訪問者更有價值,您可能想使用MySQL作為一個工具。例如,如果為站點的訪問者運行信息板或討論清單,則可以使用MySQL保留信息的軌跡。在這種情況下,數據庫的角色更微妙,訪問者甚至可以不關心您必須提供給他在服務器中執行的部分。您打算使用MySQL提高Web 服務器的能力。這可能也是Web 站點開發者的一個觀點。
這些想法並不矛盾。例如,在Historical League 情況下,我們想通過允許聯機輸入來作為成員獲取訪問成員目錄內容的一種方法而使用We b。提供對數據庫的訪問是Web 的一個用法。同時,League 的Web 站點在某些方面有些不完全,所以向站點增加目錄內容,以便為成員提高站點的價值。增強站點所提供的服務是數據庫的一種用法。
無論您如何看待MySQL與Web 的結合,實現方法都是類似的,即將前台的Web 站點與後台的MySQL連接,使用Web 服務器作為媒介。Web 服務器將查詢從用戶發送到MySQL服務器,檢索查詢結果,然後將它們傳送給客戶,在浏覽器上顯示。
當然,不一定要聯機處理數據,但這樣做往往有好處,特別是與經過標准的MySQL客戶機程序訪問數據做比較時:
■ 通過Web 訪問數據,人們可以使用他們喜歡的浏覽器,在他們喜歡的平台上運行。他們不限制MySQL客戶機程序所運行的系統。Web 浏覽器更是這樣,無論MySQL客戶機分布如何廣泛。
■ Web 界面的使用比獨立命令行的MySQL客戶機程序的使用更簡單。
■ Web 界面可以根據特殊應用程序的要求來定制。而MySQL客戶機程序是用固定接口來完成基本功能的工具。
■ 動態Web 頁面擴充了MySQL的能力,它可以做到用MySQL客戶機很難做到或根本不可能做到的事情。例如,僅用MySQL客戶機程序不可能真正地使一體化購買車輛的應用程序組合成整體。
任何編程語言都可用來編寫基於Web 的應用程序,但是,有些語言比其他語言更適合一些。請參閱5 . 2節“選擇A P I”,我們將看到這點。
查看全套"Mysql入門系列教程 ">>>>>