You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在独立Swift可执行包中配置vapor/fluent与fluent-sqlite-driver?

独立Swift可执行包中使用FluentSQLiteDriver/Fluent的最小配置示例

由于Fluent及FluentSQLiteDriver的官方文档主要围绕Vapor框架展开,独立使用的配置说明较少,以下是两种场景下的最小可运行示例:


一、仅使用FluentSQLiteDriver(原生SQL调用)

1. Package.swift配置

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "FluentSQLiteStandalone",
    dependencies: [
        .package(url: "https://github.com/vapor/fluent-sqlite-driver.git", from: "4.0.0"),
    ],
    targets: [
        .executableTarget(
            name: "FluentSQLiteStandalone",
            dependencies: [.product(name: "FluentSQLiteDriver", package: "fluent-sqlite-driver")]
        ),
    ]
)

2. 主代码(main.swift)

import FluentSQLiteDriver
import NIOCore
import NIOPosix

// 创建事件循环组(Fluent/NIO依赖的核心运行环境)
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
defer {
    // 程序结束时优雅关闭事件循环组
    try? eventLoopGroup.syncShutdownGracefully()
}

do {
    // 配置SQLite数据库:使用本地文件test.db,也可配置为内存存储(.memory)
    let config = SQLiteConfiguration(storage: .file(path: "test.db"))
    let driver = try SQLiteDriver(configuration: config, eventLoopGroup: eventLoopGroup)
    
    // 获取数据库连接
    let conn = try driver.connect().wait()
    defer {
        try? conn.close().wait()
    }
    
    // 执行原生SQL:创建用户表
    try conn.query("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)").wait()
    
    // 插入数据
    try conn.query("INSERT INTO users (name) VALUES (?)", ["Alice"]).wait()
    
    // 查询并打印结果
    let rows = try conn.query("SELECT * FROM users").wait()
    for row in rows {
        let id = try row.decode(column: "id", as: Int.self)
        let name = try row.decode(column: "name", as: String.self)
        print("用户:\(id) - \(name)")
    }
} catch {
    print("错误:\(error)")
}

二、使用Fluent ORM + FluentSQLiteDriver

1. Package.swift配置

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "FluentORMStandalone",
    dependencies: [
        .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"),
        .package(url: "https://github.com/vapor/fluent-sqlite-driver.git", from: "4.0.0"),
    ],
    targets: [
        .executableTarget(
            name: "FluentORMStandalone",
            dependencies: [
                .product(name: "Fluent", package: "fluent"),
                .product(name: "FluentSQLiteDriver", package: "fluent-sqlite-driver")
            ]
        ),
    ]
)

2. 主代码(main.swift)

import Fluent
import FluentSQLiteDriver
import NIOCore
import NIOPosix

// 定义ORM模型:对应数据库中的users表
final class User: Model {
    static let schema = "users" // 表名
    
    @ID(key: .id)
    var id: UUID? // 主键
    
    @Field(key: "name")
    var name: String // 普通字段
    
    // 必需的空初始化方法
    init() {}
    
    // 自定义初始化方法
    init(id: UUID? = nil, name: String) {
        self.id = id
        self.name = name
    }
}

// 扩展模型,添加迁移逻辑(用于创建表结构)
extension User {
    struct Migration: AsyncMigration {
        func prepare(on database: Database) async throws {
            try await database.schema("users")
                .id()
                .field("name", .string, .required)
                .create()
        }
        
        func revert(on database: Database) async throws {
            try await database.schema("users").delete()
        }
    }
}

// 创建数据库配置
func makeDatabaseConfig() -> DatabaseConfiguration {
    return SQLiteConfiguration(storage: .file(path: "orm_test.db")).configuration()
}

// 事件循环组
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
defer {
    try? eventLoopGroup.syncShutdownGracefully()
}

do {
    // 初始化数据库管理器
    let databaseConfig = makeDatabaseConfig()
    let databases = Databases(configuration: [.default: databaseConfig])
    
    // 运行迁移,创建表结构
    try databases.migrate(migrations: [User.Migration()], on: .default).wait()
    
    // 获取默认数据库实例
    guard let db = databases.database(.default, eventLoop: eventLoopGroup.next()) else {
        fatalError("无法获取数据库实例")
    }
    
    // 创建并保存用户
    let user = User(name: "Bob")
    try user.save(on: db).wait()
    print("已保存用户,ID:\(user.id!)")
    
    // 查询所有用户并打印
    let users = try User.query(on: db).all().wait()
    for user in users {
        print("查询到用户:\(user.id!) - \(user.name)")
    }
} catch {
    print("错误:\(error)")
}

内容的提问来源于stack exchange,提问作者marc-medley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:55:22