0

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

谢谢,

汤姆

4

1 回答 1

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 函数中看到我是如何应用它的。再次感谢你的帮助!

于 2013-06-12T01:06:07.153 回答