我正在尝试使用 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”的第三列被设置为主列时,它就可以工作了,另外两列有一个简单的引用(就像我为一篇文章的作者所做的那样)。
我做错了什么?
我认为,您的问题是您有一个 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],
}
]
});
ArticleThemes
表的 articleId
和 theme
列创建复合主键。