F# 優雅使用Dapper進行資料庫操作
本文來自圖靈社群@fairjm 轉截請註明出處
之前寫過一篇用SQLProvider
進行資料庫連線的,但實際使用的時候發現相容性不是很好,在用mysql的時候很多表都找不到,要反覆rebuild.
直接使用ADO.NET
的話就顯得麻煩.
來看一下ADO.NET
一個查詢到例子
let cStr = @"Server=地址;Port=埠;Database=資料庫名稱;Uid=使用者名稱;Pwd=密碼;"
use conn = new MySqlConnection(cStr)
let command = conn.CreateCommand(CommandText = "SELECT * FROM user LIMIT 1",
CommandType = CommandType.Text)
conn.Open()
use reader = command.ExecuteReader()
let idOrder = reader.GetOrdinal("userid")
if reader.Read() then
// int 可以用string
printfn "%s" <| reader.GetString(idOrder)
printfn "%d" <| reader.GetInt32("userid")
printfn "%s" <| reader.GetString("username")
printfn "%A" <| reader.GetDateTime("created")
// date 也可以用string
printfn "%s" <| reader.GetString("created")
reader.Close()
conn.Close()
如果要用引數化的話還需要以下程式碼來設定SqlCommand
//建立SqlCommand物件
SqlCommand cmd = conn.CreateCommand();
//預設就是text
cmd.CommandType = CommandType.Text;
//sql語句
cmd.CommandText = "select * from products = @ID";
cmd.Parameters.Add("@ID", SqlDbType.Int);
//給引數sql語句的引數賦值
cmd.Parameters["@ID"].Value = 1;
作為常常寫指令碼的工具,我對資料庫查詢的需求是使用簡單方便,因為是寫指令碼,所以不會涉及到很多表的JOIN
,一對多,多對多的處理等等,能方便讀取行資料就可以了.
這一點Dapper可以很好滿足.Dapper可以使用dynamic object
作為查詢引數和返回結果.
但FSharp似乎沒有直接使用dynamic object
的方式(有的話歡迎打臉...沒找著),這裡可以借用第三方的專案來.比如FSharp.Interop.Dynamic
.
使用之後構建查詢就方便多了:
let query = ExpandoObject()
query?userId <- 1
也可以直接解析返回結果
需要的擴充套件:
Install-Package FSharp.Interop.Dynamic
Install-Package MySql.Data -Version 6.9.9
Install-Package Dapper
程式碼:
open MySql.Data.MySqlClient
open FSharp.Interop.Dynamic
open Dapper
open System
open System.Dynamic
let getConnection (addr, user, pass, db, port) =
let builder = new MySqlConnectionStringBuilder()
builder.Server <- addr
builder.UserID <- user
builder.Password <- pass
builder.Database <- db
builder.Port <- port
let conn = new MySqlConnection(builder.ConnectionString)
conn.Open()
conn
let conn = getConnection("","","","",3306)
let query = ExpandoObject()
query?userId <- 1
let obj = conn.QueryFirst("select * from user where userid = @userId", query)
let objs = conn.Query("select * from user limit 10")
printfn "%A" obj?username
objs
|> Seq.iter (fun e -> printfn "%s" e?username)
conn.Close()
對比上面ADO.NET
的例子
使用就比較簡單直接了~
還有one to many的例子有點長 可以看gist的程式碼:
https://gist.github.com/fairjm/8d2c8b2fd8db549364447a78d2bdad4f
相關文章
- 使用SpringBoot進行優雅的資料驗證Spring Boot
- [Android開源]EasySharedPreferences:優雅的進行SharedPreferences資料儲存操作Android
- 使用Spring Data JPA進行資料庫操作Spring資料庫
- 如何使用帝國CMS進行資料庫匯出操作?資料庫
- 在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle資料庫NetCoreC#APPOracle資料庫
- Python 連線mysql資料庫進行操作PythonMySql資料庫
- Spring Boot整合Spring Data JPA進行資料庫操作Spring Boot資料庫
- Django資料庫效能優化之 - 使用Python集合操作Django資料庫優化Python
- 【Falsk 使用資料庫】---- 資料庫基本操作資料庫
- 使用Redis和Java進行資料庫快取 - DZone資料庫RedisJava資料庫快取
- Markdown 利用HTML進行優雅排版HTML
- 使用MySQL Workbench進行資料庫備份MySql資料庫
- 如何使用 RxJS 更優雅地進行定時請求JS
- 手把手教你在Flutter專案優雅的使用ORM資料庫FlutterORM資料庫
- 使用Java和Flyway進行資料庫版本控制Java資料庫
- 使用Redis和Java進行資料庫快取RedisJava資料庫快取
- 如何使用Java Streams進行資料庫查詢?Java資料庫
- 使用 Guzzle 中介軟體進行優雅的請求重試
- 手把手教你在Flutter專案優雅的使用ORM資料庫(下篇)FlutterORM資料庫
- 手把手教你在Flutter專案優雅的使用ORM資料庫--下篇FlutterORM資料庫
- python 操作 PostgreSQL 資料庫,執行緒並行修改 5w 條資料,效能優化PythonSQL資料庫執行緒並行優化
- Java中使用jcifs庫操作SMB協議進行檔案操作Java協議
- 如何優雅的對UITableView進行解耦UIView解耦
- 如何對分散式 NewSQL 資料庫 TiDB 進行效能調優分散式SQL資料庫TiDB
- 這個資料庫表如何設計的更優雅?資料庫
- 使用SQL_TRACE進行資料庫診斷(轉)SQL資料庫
- 使用離線工具dmbackup進行資料庫備份資料庫
- 使用python進行Oracle資料庫效能趨勢分析PythonOracle資料庫
- 如何優雅地使用Redis之點陣圖操作Redis
- 使用SSMS操作AdventureWorks 示例資料庫SSM資料庫
- Laravel 優雅填充 SQL 資料LaravelSQL
- 基礎篇:JAVA.Stream函式,優雅的資料流操作Java函式
- 使用nodejs對Marketing Cloud的contact主資料進行修改操作NodeJSCloud
- 資料庫上雲實踐:使用Ora2pg進行資料庫遷移資料庫
- 如何優雅的使用執行緒池執行緒
- 優雅的操作檔案:java.nio.file 庫介紹Java
- EMQX 在 Kubernetes 中如何進行優雅升級MQ
- SpringBoot如何優雅的進行引數校驗Spring Boot
- 如何使用責任鏈預設優雅地進行引數校驗?