Nim 语言 Web 应用数据库交互示例

Nim阿木 发布于 22 天前 5 次阅读


Nim 语言 Web 应用数据库交互示例

Nim 是一种高性能、易于学习的编程语言,它结合了静态类型和动态类型的优点,同时提供了编译时检查和运行时效率。在 Web 应用开发中,数据库交互是必不可少的一环。本文将围绕 Nim 语言,通过一个简单的 Web 应用示例,展示如何实现与数据库的交互。

准备工作

在开始之前,我们需要准备以下环境:

1. Nim 语言环境:可以从 Nim 官网下载并安装 Nim 编译器。

2. Web 服务器:可以使用 Nginx 或 Apache 作为 Web 服务器。

3. 数据库:本文将使用 SQLite 作为数据库。

示例项目结构

以下是一个简单的 Nim 语言 Web 应用项目结构:


myapp/


├── src/


│ ├── main.nim


│ ├── db/


│ │ ├── db.nim


│ │ └── models/


│ │ └── user.nim


│ ├── http/


│ │ ├── routes.nim


│ │ └── handlers/


│ │ └── handlers.nim


│ └── templates/


│ └── index.html


├── run.sh


└── README.md


数据库模型

我们需要定义数据库模型。在 `src/db/models/user.nim` 文件中,我们可以定义一个用户模型:

nim

type


User = ref object of RootObj


id: int


username: string


email: string


数据库操作

接下来,我们需要在 `src/db/db.nim` 文件中实现数据库操作:

nim

import sqlite, strformat

let db = open("myapp.db", mode = openReadWrite)

proc createUser(username: string, email: string): int =


let query = "INSERT INTO users (username, email) VALUES (?, ?)"


let stmt = db.prepare(query)


stmt.bindParam(0, username)


stmt.bindParam(1, email)


let result = stmt.exec()


result.lastInsertRowid

proc getUserById(id: int): User =


let query = "SELECT FROM users WHERE id = ?"


let stmt = db.prepare(query)


stmt.bindParam(0, id)


let result = stmt.exec()


if result.fetchRow:


let row = result.fetchRow


result.close()


User(


id: row[0].getInt,


username: row[1].getStr,


email: row[2].getStr


)


else:


result.close()


nil

proc getAllUsers(): seq[User] =


let query = "SELECT FROM users"


let stmt = db.prepare(query)


let result = stmt.exec()


var users: seq[User]


while result.fetchRow:


let row = result.fetchRow


users.add(User(


id: row[0].getInt,


username: row[1].getStr,


email: row[2].getStr


))


result.close()


users


Web 路由和处理器

在 `src/http/routes.nim` 文件中,我们定义 Web 路由和对应的处理器:

nim

import httpbeast, asyncdispatch, asyncnet, json, uri, parseuri

proc indexHandler(req: Request): Future[Response] {.async.} =


let users = db.getAllUsers()


let usersJson = % users


let response = newResponse(Http200, "application/json")


response.body = $usersJson


return response

proc createUserHandler(req: Request): Future[Response] {.async.} =


let json = await req.body


let usersJson = parseJson(json)


let username = usersJson["username"].getStr


let email = usersJson["email"].getStr


let userId = db.createUser(username, email)


let response = newResponse(Http201, "application/json")


response.body = $userId


return response

proc getUserByIdHandler(req: Request): Future[Response] {.async.} =


let userId = parseUri(req.url).path[1..^1].parseInt


let user = db.getUserById(userId)


if user.isNil:


let response = newResponse(Http404, "application/json")


response.body = $userId


return response


let userJson = % user


let response = newResponse(Http200, "application/json")


response.body = $userJson


return response


主程序

在 `src/main.nim` 文件中,我们创建 Web 服务器并注册路由:

nim

import httpbeast, asyncdispatch, asyncnet, json, parseuri

proc main() =


let server = newAsyncHttpServer()


server.serve("/users", createUserHandler)


server.serve("/users/:id", getUserByIdHandler)


server.serve("/users", indexHandler)


runForever(server)

when isMainModule:


main()


运行示例

1. 在项目根目录下创建 `run.sh` 脚本,内容如下:

sh

nim c -r src/main.nim


2. 在终端中运行 `./run.sh` 启动 Web 服务器。

3. 使用浏览器或 Postman 工具访问以下 URL 进行测试:

- `http://localhost:8080/users`:获取所有用户

- `http://localhost:8080/users/1`:获取 ID 为 1 的用户

- `http://localhost:8080/users`:创建新用户

总结

本文通过一个简单的 Nim 语言 Web 应用示例,展示了如何实现与数据库的交互。在实际项目中,我们可以根据需求扩展数据库模型和操作,以及添加更多路由和处理器。Nim 语言以其高性能和易用性,在 Web 应用开发中具有很大的潜力。