Perfect 数据库操作

mongoDB

func resignRoutes() {
  // mongoDB数据库test,collection为test的数据展示
  routes.add(method: .get, uri: "/mongodb/test") { (req, resp) in
        resp.appendBody(string: collectionName(name: "test"))
        resp.completed()
  }
   // mongoDB数据库test,collection为info的数据展示
  routes.add(method: .get, uri: "/mongodb/info") { (req, resp) in
        
        resp.appendBody(string: collectionName(name: "info"))
        resp.completed()
  }
 // 表单提交,向collection为info中添加数据
  routes.add(method: .post, uri: "/mongodb/add") { (req, resp) in
        do {
            // 启动数据库
            let mongodb = try MongoClient(uri: "mongodb://localhost")
            // 获取数据库
            let database = mongodb.getDatabase(name: "test")
            // 获取collection
            let collection = database.getCollection(name: "info")
            
            defer {
                collection?.close()
                database.close()
                mongodb.close()
            }
            // 处理请求参数,格式化
            let params:[(String,String)] = req.postParams
            
            var json = "{"
            
            for param in params {
                let str = "\"" + param.0 + "\"" + ":" + "\"" + param.1 + "\"" + ","
                json.append(str)
            }
            
            
            let range = Range<String.Index>(json.index(json.endIndex, offsetBy: -1)..<json.endIndex)
            
            json.replaceSubrange(range, with: "}")
            
            let bson:BSON = try BSON(json: json)
            
            let result = collection?.insert(document: bson)
            
            resp.appendBody(string: result.debugDescription)
            resp.completed()
            
            
        } catch {
            print(error)
        }
        
    }

    server.addRoutes(routes)
}
func collectionName(name:String) ->  String{
    do {
        // 1.连接数据库
        let client = try MongoClient(uri: "mongodb://localhost")
        // 1.获取数据库名字
        print(client.databaseNames())
        // 2.获取指定名称的数据库
        let db = client.getDatabase(name: "test")
        // 2.获取数据库collection名称
        print(db.collectionNames())
        // 3.获取指定名称collection
        let collection = db.getCollection(name: name)
        
        defer{
            // 在该请求结束时确保关闭collection,db,client
            collection?.close()
            db.close()
            client.close()
        }
        // 查询数据,返回查询游标
        let find = collection?.find(query: BSON())
        
        
        var arr:[[String:Any]] = [[String:Any]]()
        for fin in find! {
            let encode = fin.asString
            // json字符串解码
            let decode = try encode.jsonDecode() as! [String:Any]
            
            arr.append(decode)
        }
        
        let result = ["message":arr]
        // 字典数据编码为json字符串
        let jsonStr = try result.jsonEncodedString()
        
        return jsonStr
    } catch {
        print(error)
        return ""
    }
}

MySQL

fileprivate let mysql_host = "localhost"
fileprivate let mysql_user = "root"
fileprivate let mysql_pwd = ""
fileprivate let mysql_db = "test"
fileprivate let mysql_socket = "/tmp/mysql.sock"

func resignRoutes() {
   routes.add(method: .get, uri: "/mysql") { (req, resp) in
        let dataMysql = MySQL()  // create an instance of mySQL to work with
        
        // connect to database
        let connect = dataMysql.connect(host: mysql_host, user: mysql_user, password: mysql_pwd, db: mysql_db, socket: mysql_socket)
        
        guard connect else {
            // failed to connect database
            print(dataMysql.errorMessage())
            return
        }
        
        defer {
            // close database when already used
            dataMysql.close()
        }
        
        // create tables
        let sql = "create table if not exists person (id integer primary key AUTO_INCREMENT, name varchar(50), age int)"
        if (dataMysql.query(statement: sql)){
            print("Success")
            resp.appendBody(string: "connect mysql success!")
            resp.completed()
        }
    }
    
    routes.add(method: .get, uri: "/mysql/add") { (req, resp) in
        let dataMysql = MySQL()
        
        let connect = dataMysql.connect(host: mysql_host, user: mysql_user, password: mysql_pwd, db: mysql_db, socket: mysql_socket)
        guard connect else {
            print(dataMysql.errorMessage())
            return
        }
        defer {
            dataMysql.close()
        }
        
        let name:String = req.param(name: "name") ?? ""
        let age:Int = Int(req.param(name: "age") ?? "0")!
        
        let sql = "insert into person (name,age) values (\(name),\(age))"
        
        if (dataMysql.query(statement: sql)){
            resp.appendBody(string: "insert person success")
        } else {
            resp.appendBody(string: "fail to insert person")
        }
        resp.completed()
    }
    
    routes.add(method: .get, uri: "/mysql/query") { (req, resp) in
        let dataMysql = MySQL()
        let connect = dataMysql.connect(host: mysql_host, user: mysql_user, password: mysql_pwd, db: mysql_db, socket: mysql_socket)
        
        guard connect else {
            resp.appendBody(string: dataMysql.errorMessage())
            resp.completed()
            return
        }
        
        defer {
            dataMysql.close()
        }
        
        let sql = "select * from person"
        if(dataMysql.query(statement: sql)){
            let results = dataMysql.storeResults()
            var person:[[String:Any]] = [[String:Any]]()
            // 数据查询
            results?.forEachRow(callback: { (element) in
                let person_id:Int = Int(element[0] ?? "0")!
                let person_name:String = element[1]!
                let person_age:Int = Int(element[2] ?? "0")!
                person.append(["id":person_id,"name":person_name,"age":person_age])
            })
            
            let respResult = ["psersons":person]
            do {
                try resp.appendBody(string: respResult.jsonEncodedString())
            } catch {
                print(error)
            }
        } else {
            resp.appendBody(string: "操作出现错误")
        }
        resp.completed()
    }

    server.addRoutes(routes)
}

SQLite

// 需要在产品目录下创建db文件夹,其他路径没有尝试过
fileprivate let sqlite_dbpath = "./db/database"

func resignRoutes() {
   routes.add(method: .get, uri: "/sqlite3") { (req, resp) in
        
        do {
            let sqlite = try SQLite(sqlite_dbpath)
            
            defer {
                sqlite.close()
            }
            
            let sql = "create table if not exists person (id integer primary key AUTOINCREMENT, name text, age int)"
            try sqlite.execute(statement: sql)
            resp.appendBody(string: "Success!")
            resp.completed()
        } catch {
            print(error)
        }
    }
    
    routes.add(method: .get, uri: "/sqlite3/add") { (req, resp) in
        
        do {
            let sqlite = try SQLite(sqlite_dbpath)
            
            let person_name:String = req.param(name: "name") ?? ""
            let person_age:Int = Int(req.param(name: "age") ?? "0")!
            
            let sql = "insert into person (name, age) values (\(person_name),\(person_age))"
            try sqlite.execute(statement: sql)
            
            resp.appendBody(string: "Success!")
            resp.completed()
            
        } catch {
            print(error)
        }
    }
    
    routes.add(method: .get, uri: "/sqlite3/query") { (req, resp) in
        
        do {
            let sqlite = try SQLite(sqlite_dbpath)
            let sql = "select * from person"
            
            var result:[[String:Any]] = [[String:Any]]()
            
            try sqlite.forEachRow(statement: sql, handleRow: { (stmt, index) in
                let id:Int = stmt.columnInt(position: 0)
                let name:String = stmt.columnText(position: 1)
                let age:Int = stmt.columnInt(position: 2)
                let temp:[String:Any] = ["id":id,"name":name,"age":age]
                result.append(temp)
            })
            
            let lastResult = ["persons":result]
            try resp.appendBody(string: lastResult.jsonEncodedString())
            resp.completed()
        } catch {
            print(error)
        }
    }
    
    
    server.addRoutes(routes)

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容