如何在独立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
相关产品推荐
相关产品推荐

