SqlDelight/SQLite 没有正确执行连接?

Posted

技术标签:

【中文标题】SqlDelight/SQLite 没有正确执行连接?【英文标题】:SqlDelight/SQLite not executing joins properly? 【发布时间】:2019-11-19 18:58:01 【问题描述】:

我已将 SqlDelight 添加到我的多平台项目中,并创建了一些基本表和查询。

但当我尝试使用更复杂的查询时,例如JOINS,查询仍会执行,并且生成的接口包含所有正确的字段,但实际对象不包含生成的数据。

GithubRepository.sq:

CREATE TABLE GithubRepository (
    id INTEGER NOT NULL PRIMARY KEY,
    name TEXT NOT NULL
);

Foobar.sq:

CREATE TABLE foobar (
    id INTEGER NOT NULL PRIMARY KEY,
    foobar TEXT NOT NULL,
    repoId INTEGER NOT NULL,
    FOREIGN KEY(repoId) REFERENCES GithubRepository(id)
);

findFoobars:
SELECT *
FROM foobar
LEFT JOIN GithubRepository ON GithubRepository.id = foobar.repoId;

insert:
INSERT INTO foobar VALUES ?;

现在,我通过几个测试验证它是否有效,如下所示:

    @Test
    fun `Joins working?`() 
        assertEquals(0, queries.findAll().executeAsList().size)

        queries.insert(GithubRepository.Impl(2, "bar"))
        foobarQueries.insert(Foobar.Impl(1, "foo", 2))

        assertEquals("bar", foobarQueries.findFoobars().executeAsList()[0].name)
    

所有单个查询都成功,我可以按预期写入和读取所有表。

碰巧当使用JOIN 访问查询时,joined 属性保持为空。

在更复杂的设置中,我还在 android 模拟器上进行了测试,我可以从所有单独的表中读取,但不能从连接的字段中读取。

谁能发现我遗漏了什么?

【问题讨论】:

【参考方案1】:

经过更多试验,我意识到我在 Android 上使用的是内存数据库。通过将数据库名称传递给 AndroidSqliteDriver 构造函数将其切换到基于文件的适当 SQLite 数据库后,JOINS 将正确执行并正确填写预期字段。

这似乎是内存数据库驱动程序的限制。我希望将测试切换到基于文件的测试也能解决测试失败问题。

【讨论】:

以上是关于SqlDelight/SQLite 没有正确执行连接?的主要内容,如果未能解决你的问题,请参考以下文章

在没有 PreparedStatement 的情况下如何正确转义字符串?

JTDS 未连接到正确的数据库

使用 PDO 连接到 Sybase 的正确 DSN

在 Windows 应用程序中模拟连接到远程机器(c#)

Azure *** - 没有连接到 VNET

推送通知未正确连接到 Firebase 消息传递