我有一个同时采用TableRecord和FetchableRecord的类。我正在利用GRDB提供的自动查询生成的优势,我只提供表名,因为它与类名不匹配。但是,现在我希望添加仅在运行时使用的存储属性,并且不希望GRDB尝试以自动方式获取这些属性。我可以从查询中排除某些变量吗?
这里是我的代码:
class Question: Identifiable, Codable, TableRecord, FetchableRecord {
static var databaseTableName = "questions"
var id: Int?
var category: Int?
var code: String?
var ...
var ...
var ...
var ...
var selectedAnswer: Int? // This is only used at run-time and not present in the database.
}我发现了这个:
static var databaseSelection = [Column("id"), Column("category"), Column("code"), ...]但这要求我手动指定希望它获取的所有列。我可以做相反的事情,只排除一列(selectedAnswer)吗?
,基本上,我要找的是这样的东西:
static var excludedVariables = ["selectedAnswer"]我读了一遍文档,找不到任何东西,但我不知道GRDB,所以我可能遗漏了一些东西。
发布于 2022-01-31 17:25:34
我认为这不是一个特定的GRDB问题,而是更多的Codable问题,即“如何排除一个属性被解码”。因此,您的解决方案可以是显式地定义编码键,而不是让Swift合成它们:
enum CodingKeys: String, CodingKey {
case id, category, code, ...
}它仍然要求您定义所有的列/属性,但是当您想要排除某些属性时,Codable总是这样。
发布于 2022-02-01 13:00:21
你不需要做任何事情:
默认情况下,
SELECT * FROM ...)。如果没有用于非持久化属性的列,则不会获取它(生成的SQL中也不会插入无效的列)。nil。。
例如:
import GRDB
var configuration = Configuration()
configuration.prepareDatabase { db in
db.trace { print("SQL> \($0)") }
}
let dbQueue = DatabaseQueue(configuration: configuration)
struct Player: Identifiable, Codable, TableRecord, FetchableRecord {
var id: Int64
var name: String
var score: Int
var ignored: Int? // Has no matching column in the database
}
try dbQueue.write { db in
try db.create(table: "player") { t in
t.autoIncrementedPrimaryKey("id")
t.column("name", .text).notNull()
t.column("score", .integer).notNull()
}
try db.execute(sql: """
INSERT INTO player (id, name, score) VALUES (NULL, 'Arthur', 100);
INSERT INTO player (id, name, score) VALUES (NULL, 'Barbara', 1000);
""")
// SELECT * FROM player
let players = try Player.fetchAll(db)
// [Player(id: 1, name: "Arthur", score: 100, ignored: nil),
// Player(id: 2, name: "Barbara", score: 1000, ignored: nil)]
print(players)
}https://stackoverflow.com/questions/70929205
复制相似问题