iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
Software Development

NoSQL: Not Only SQL系列 第 27

[Day 27] Column Family Database:以 Cassandra 為例

  • 分享至 

  • xImage
  •  

Cassandra 生態系提供非常多語言的 Client Drivers,可以在官方網站查看針對各語言提供的工具。這次同樣使用 .NET6 WebAPI 專案搭配 NuGet 套件進行開發。

基本設定

先建立要使用的 Keyspace 和 Table,具體操作細節可參考昨天的文章

cqlsh> CREATE KEYSPACE user_info WITH replication = { 'class':'SimpleStrategy', 'replication_factor':1 };
cqlsh> use user_info;
cqlsh:user_info> CREATE TABLE notification_setting ( user_id text PRIMARY KEY, need_notify boolean, email text);

建立 WebAPI 專案,版本為 .NET6,命名為 IronmanCassandraDbDemo
https://ithelp.ithome.com.tw/upload/images/20220929/20151137oSyOz7v0zS.png

專案加入對 CassandraCSharpDriver NuGet套件 的參考。
https://ithelp.ithome.com.tw/upload/images/20220929/20151137ky54REcdDL.png

把接下來會需要用到的常數都先放在 Consts.cs 中。

public static class Consts
{
    public static string Host = "localhost";
    public static int Port = 1236;
    public static string KeySpaceName = "user_info";
}

在 Program.cs 中注入 Cassandra.Cluster 並設定連線資訊,接著注入 Cassandra.ISession

注意這些類別的 Namespace,小心不要誤用到微軟本身提供的類別。

// Add services to the container.
builder.Services.AddSingleton(Cluster.Builder()
    .AddContactPoints(Consts.Host)
    .WithPort(Consts.Port)
    .Build());
builder.Services.AddTransient(sp =>
{
    var cluster = sp.GetRequiredService<Cluster>();
    return cluster.Connect(Consts.KeySpaceName);
});

建立 NotificationSettingsController.cs ,並在建構子取得剛剛注入的 ISession。

[ApiController]
[Route("[controller]/[action]")]
public class NotificationSettingsController : ControllerBase
{
    private readonly ISession _session;

    public NotificationSettingsController(ISession session)
    {
        _session = session;
    }
}

建立 NotificationSettings 類別。

public class NotificationSettings
{
    public string UserId { get; set; }
    public bool NeedNotify { get; set; }
    public string Email { get; set; }
}

建立 API Endpoint 及其功能

接下來就可以建立各功能的 endpoint 及功能了,包含:

  • 新增或修改 Email 通知設定
  • 以 UserId 查詢設定
  • 以 UserId 刪除設定

因為是練習且東西不複雜,就偷懶不再特別做額外的分層。

首先先建立新增或修改 Email 通知設定的 API。基本上使用起來跟直接透過 cqlsh 下 cql 差不多,直接寫好語法後呼叫 session.Execute("你的語法"); 即可。如果需要設定參數,則使用 Prepare("你的語法").Bind(參數們) 的方式,語法中要帶入參數的部分使用 ?,並在 Bind() 中依序傳入。

變數要以參數傳遞,不要自己做字串相加或組合。

[HttpPost]
public IActionResult Upsert([FromBody]NotificationSettings payload)
{
    var statement = this._session
            .Prepare(@"INSERT INTO notification_setting (user_id, need_notify, email) VALUES (?, ?, ?);")
            .Bind(payload.UserId, payload.NeedNotify, payload.Email);
    this._session.Execute(statement);
    return NoContent();
}

接著是查尋的 API,從 Execute 的回傳取出第一個 Row,並使用 row.GetValue<型別>("欄位名稱") 取出資料。

[HttpGet]
public IActionResult Get(string userId)
{
    var statement = this._session
        .Prepare(@"SELECT user_id, need_notify, email FROM notification_setting WHERE user_id = ?;")
        .Bind(userId);
    var row = this._session.Execute(statement).FirstOrDefault();
    if (row is null)
    {
        return NotFound();
    }

    return Ok(new NotificationSettings
    {
        UserId = row.GetValue<string>("user_id"),
        NeedNotify = row.GetValue<bool>("need_notify"),
        Email = row.GetValue<string>("email"),
    });
}

最後是刪除的功能。

[HttpDelete]
public IActionResult Remove(string userId)
{
    var statement = this._session
        .Prepare(@"DELETE FROM notification_setting WHERE user_id = ?;")
        .Bind(userId);
    this._session.Execute(statement);
    return NoContent();
}

這樣基本的 API 就開發完成了!
https://ithelp.ithome.com.tw/upload/images/20220929/20151137wbzZ4vlq6H.png


上一篇
[Day 26] Column Family Database:以 Cassandra 為例
下一篇
[Day 28] Graph Database: 簡介
系列文
NoSQL: Not Only SQL30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言