无法在 Astro DB 中使用“foreignKeys”(外键不匹配)

问题描述 投票:0回答:1

我正在尝试使用 Astro DB,但遇到了一个非常奇怪的问题,这对我来说毫无意义。

以下是与我的问题相关的表格(在

/db/config.ts
中):

const Article = defineTable({
    columns: {
        id: column.number({ primaryKey: true }),
        author: column.number({ references: () => User.columns.id }),
        title: column.text(),
        date: column.date(),
        description: column.text(),
        text: column.text(),
    },
    indexes: [
        { on: ["id", "author"], unique: true }
    ]
});

const Theme = defineTable({
    columns: {
        theme: column.text({ primaryKey: true }),
    }
});

const ArticleThemes = defineTable({
    columns: {
        articleId: column.number(),
        theme: column.text(),
    },
    foreignKeys: [
        {
            columns: ["articleId", "theme"],
            references: () => [Article.columns.id, Theme.columns.theme],
        }
    ]
});

这是一种基本的多对多关系,一篇文章具有一个或多个主题,每个主题可以分配给多篇文章。

由于表“ArticleThemes”由两个外键组成,因此我在按照文档中的建议定义表时使用“foreignKeys”属性(链接此处)。

但是在我的开发环境中播种数据库时会导致问题(在

/db/seeds.ts
中):

import { db, Article, Theme, ArticleThemes } from 'astro:db';

async function seedBlogArticles() {
    await db.insert(Article).values([
        {
            id: 1,
            author: 1,
            date: new Date(),
            text: "This is a very interesting blog post",
            title: "An interesting blog post",
            description: "Very interesting indeed",
        }
    ]);
}

async function seedThemes() {
    await db.insert(Theme).values([
            { theme: "svelte" },
        ]
    );
}


async function seedBlogArticleThemes() {
    await db.insert(ArticleThemes).values([
        {
            articleId: 1,
            theme: "svelte",
        },
    ])
}

// https://astro.build/db/seed
export default async function seed() {
    await seedThemes();
    await seedBlogArticles();
    await seedBlogArticleThemes();
}

这是我在控制台中收到的错误:

[astro:db] New local database created.
[ERROR] [astro:db] Failed to seed database:
SQLITE_ERROR: foreign key mismatch - "ArticleThemes" referencing "Article"

注意:还有一个 User 表,但与问题无关。该错误特别发生在调用

seedBlogArticleThemes()
时。

当我在

ArticleThemes
中有一个名为“id”的第三列被设置为主列时,它就可以工作了,另外两列有一个简单的引用(就像我为一篇文章的作者所做的那样)。

我做错了什么?

database sqlite astrojs
1个回答
0
投票

我认为,您的问题是您有一个 FKey 试图访问两个父表(理论上),但外键只能引用单个表和其中的一个或多个列)。

我相信您需要为每个表(文章和主题)定义 2 个外键。

所以类似:-

const ArticleThemes = defineTable({
    columns: {
        articleId: column.number(),
        theme: column.text(),
    },
    foreignKeys: [
        {
            columns: ["articleId"],
            references: () => [Article.columns.id],
        },
        {
            columns: ["theme"],
            references: () => [Theme.columns.theme],
        }
    ]
});
  • 注意在没有任何astrojs知识的情况下提供了答案。因此“类似”
  • 您可能希望为
    ArticleThemes
    表的
    articleId
    theme
    列创建复合主键。
    • 如果没有,那么你最终可能会得到重复的行,从而导致无意义/令人困惑的关联/x引用。
  • 您可能还希望在articleThemes表的主题列上建立索引(确保它不是唯一的)。
© www.soinside.com 2019 - 2024. All rights reserved.