erlang mysql driver_Maxkit: MySQL driver for Erlang

祁宾白
2023-12-01

MySQL/OTP 的作者提供了一份 MySQL Driver for Erlang 的比較表:Comparison of MySQL clients,除了使用最原始的 ODBC 連接 MySQL 之外,要在 erlang 連接 MySQL 目前有四個 driver:MySQL/OTP、Emysql、erlang-mysql-driver、YXA。

Emysql#History 有說明後面三個 driver 的演進的過程,從最早的 YXA,接手的是 erlang-mysql-driver,再來是 Emysql,MySQL/OTP 的作者原本也是 Emysql 的貢獻者,但覺得這個 driver 為了跟舊版 MySQL 相容,而有一些限制,因此他又做了一個 MySQL/OTP 的 driver,另外該作者又利用 PoolBoy 製作了 Connection Pool 的功能,就是 mysql-otp-poolboy。

MySQL-OTP

要直接使用 MySQL-OTP 並不困難,基本上依照 專案首頁 的方式,用 mysql:start_link 就可以連接資料庫,mysql:query 取得資料。

MySQL-OTP Poolboy

MySQL/OTP Poolboy 的部分,依照 網頁 的說明,有兩種啟動 supervisor 的方式:一種是放在自己的 supervisor 裡面,一種是使用專案中內建的 supervisor。

兩種方式都試過可以用,以下紀錄怎麼用專案中內建的 supervisor。

首先要製作 OTP appcation config 檔案,通常是放在 sys.config 裡面。

撰寫一個 otp server,在啟動 mysql_poolboy 以前,要先啟動 mysql 跟 poolboy。

啟動 MySQL/OTP Pooboy 之後,就是要使用這個 mysql connection pool,用以下的方式,可以查詢出 table 的結果

用以下的指令啟動 otp server

處理 Result Set

利用 query 查詢的結果,資料結構就像下面這樣,第一個是 ok,第二個是所有欄位名稱的 list,第三個部分是所有結果的 list of list。

處理日期

erlang 的日期格式是以下這個樣子,但對網頁資料處理來說,這個結構是沒辦法處理的。我們可以利用 erlware_commons 的 ec_date 作為日期轉換的 library。

利用 ec_date 就可以將日期轉換成字串 2016-03-31 09:56:32

但剛剛的 MySQL Result Set 裡面的日期,並沒有固定的欄位位置,我們寫一個 function,用來將 list 的 Index 位置的元素,轉換成日期字串。

以剛剛的 sql 查詢,就是第 4 以及第 6 個欄位位置是需要轉換的日期。

轉換 JSON

通常,我們會直接將資料庫取得資料的結果,以 JSON 的方式傳給前端網頁的 javascript 程式處理,所以需要設法將這些資料轉換為 JSON。

JSON 會以 jsx 這個套件來輔助處理,我們先看 encode 跟 decode 的部分,Erlang 在 17 版之後提供了 maps 的資料結構,在這裡我們有看到 jsx 有支援 maps,所以目標是先將 MySQL Result Set 轉換成 maps,再透過 jsx 轉換成 JSON。

因為是 Result Set 是 list of maps,對於 JSON 來說,前面需要再加上一個 key,才是一個完整的 JSON。

透過 lists:map 以及 lists:zip 就可以完成這項工作,最後再用 jsx:encode 轉換成 JSON。

完整的範例

以下是處理 MySQL Result Set 的完整範例程式。

References

使用 prepared statements + escape characters

 类似资料:

相关阅读

相关文章

相关问答