在FluentCassandra中将字符串转换为UTF8Type

时间:2013-06-11 14:50:21

标签: f# fluentcassandra

我正在使用F#中的FluentCassandra并尝试将字符串转换为UTF8Type以使用ExecuteNonQuery方法。有没有人成功做到这一点?

谢谢,

汤姆

1 个答案:

答案 0 :(得分:0)

谢谢Jack P.和Daniel指出我正确的方向。

为了提供更多示例以便其他人可以受益,我在F#中使用FluentCassandra编写了一个包装器,通过利用F#的简洁性使CRUD功能更加简单。我使用Nick Berardi的代码作为这个包装器的一个例子:

https://github.com/fluentcassandra/fluentcassandra/blob/master/test/FluentCassandra.Sandbox/Program.cs

例如,如果要检查密钥空间是否存在,只需调用KeySpaceExists(keyspaceName)就可以检查密钥空间是否存在,使用CreateKeyspace(keyspaceName)可以创建密钥空间等。我正在创建的图书馆在这里:

namespace Test

open System
open System.Collections.Generic
open System.Configuration
open System.Linq
open System.Text
open System.Windows
open FluentCassandra
open FluentCassandra.Connections
open FluentCassandra.Types
open FluentCassandra.Linq

module Cassandra =
    let GetAppSettings (key : string) = ConfigurationManager.AppSettings.Item(key)

    let KeyspaceExists keyspaceName =
        let server = new Server(GetAppSettings("Server"))
        let db = new CassandraContext(keyspaceName, server)
        let keyspaceNameExists = db.KeyspaceExists(keyspaceName)
        db.Dispose()
        keyspaceNameExists

    let CreateKeyspace keyspaceName = 
        let server = new Server(GetAppSettings("Server"))
        let db = new CassandraContext(keyspaceName, server)
        let schema = new CassandraKeyspaceSchema(Name=keyspaceName)
        let keyspace = new CassandraKeyspace(schema,db)
        if KeyspaceExists(keyspaceName)=false then keyspace.TryCreateSelf()
        db.Dispose()

    let DropKeyspace (keyspaceName : string ) =
        let server = new Server(GetAppSettings("Server"))
        let db = new CassandraContext(keyspaceName, server)
        match db.KeyspaceExists(keyspaceName)=true with
            // value has "ignore" to ignore the string returned from FluentCassandra
            | true -> db.DropKeyspace(keyspaceName) |> ignore
            | _ -> ()
        db.Dispose()

    let ColumnFamilyExists (keyspaceName, columnFamilyName : string) = 
        let server = new Server(GetAppSettings("Server"))
        let db = new CassandraContext(keyspaceName, server)
        let schema = new CassandraKeyspaceSchema(Name=keyspaceName)
        let keyspace = new CassandraKeyspace(schema,db)
        let columnFamilyNameExists = db.ColumnFamilyExists(columnFamilyName)
        db.Dispose()
        columnFamilyNameExists

    let CreateColumnFamily (keyspaceName, columnFamilyName: string) = 
        if ColumnFamilyExists(keyspaceName,columnFamilyName)=false then
            let server = new Server(GetAppSettings("Server"))
            let db = new CassandraContext(keyspaceName, server)
            let schema = new CassandraKeyspaceSchema(Name=keyspaceName)
            let keyspace = new CassandraKeyspace(schema,db)

            if ColumnFamilyExists(keyspaceName,columnFamilyName)=false then
                keyspace.TryCreateColumnFamily(new CassandraColumnFamilySchema(FamilyName = columnFamilyName, KeyValueType = CassandraType.AsciiType, ColumnNameType = CassandraType.IntegerType, DefaultColumnValueType = CassandraType.UTF8Type))

    let ExecuteNonQuery(keyspaceName, query: string) = 
        let server = new Server(GetAppSettings("Server"))
        let db = new CassandraContext(keyspaceName, server)
        let schema = new CassandraKeyspaceSchema(Name=keyspaceName)
        let keyspace = new CassandraKeyspace(schema,db)
        let queryUTF8 = FluentCassandra.Types.UTF8Type.op_Implicit query
        try
            db.ExecuteNonQuery(queryUTF8)
            true
        with
            | _ -> false

该库允许非常简单的一行命令来使用FluentCassandra功能。当然这只是一个开始,我计划进一步修改上述库。

open System
open System.Linq
open System.Collections.Generic
open System.Configuration
open FluentCassandra.Connections
open FluentCassandra.Types
open FluentCassandra.Linq
open Test.Cassandra

[<EntryPoint>]
let main argv =
    CreateKeyspace("test1")
    printfn "%s" (ColumnFamilyExists("test1", "table1").ToString())
    printfn "%s" (KeyspaceExists("test1").ToString())
    CreateColumnFamily("test1","table1")
    printfn "%s" (ColumnFamilyExists("test1", "table1").ToString())
    let result = ExecuteNonQuery("test1", "CREATE TABLE table2 (id bigint primary key, name varchar)")
    printfn "%s" (result.ToString())

    let wait = System.Console.ReadLine()
    0

特别是在将查询字符串转换为UTF8Type时,Daniel使用UTF8Type.op_Implicit str的方法有效。您可以在上面的ExecuteNonQuery函数中看到我是如何应用它的。再次感谢您的帮助!