build: 更新 D1 数据库迁移文件以优化表结构

This commit is contained in:
seahi committed 2026-08-07 12:53:42 +08:00
1 parent 457329d6c0
commit b565f9bcda
2 files changed
+55 -39

No files matched your search

+48 -34
View File
@@ -1,27 +1,20 @@
DROP TABLE IF EXISTS post_tags; -- BlogFlare baseline. This migration is safe to apply to a fresh database and
DROP TABLE IF EXISTS posts; -- to databases previously initialized from the legacy schema.sql file.
DROP TABLE IF EXISTS series;
DROP TABLE IF EXISTS tags;
DROP TABLE IF EXISTS categories;
DROP TABLE IF EXISTS pages;
DROP TABLE IF EXISTS settings;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS attachments;
CREATE TABLE users ( CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE, username TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL, password_hash TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP created_at DATETIME DEFAULT CURRENT_TIMESTAMP
); );
CREATE TABLE categories ( CREATE TABLE IF NOT EXISTS categories (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE, name TEXT NOT NULL UNIQUE,
slug TEXT NOT NULL UNIQUE slug TEXT NOT NULL UNIQUE
); );
CREATE TABLE series ( CREATE TABLE IF NOT EXISTS series (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE COLLATE NOCASE, name TEXT NOT NULL UNIQUE COLLATE NOCASE,
slug TEXT NOT NULL UNIQUE, slug TEXT NOT NULL UNIQUE,
@@ -29,7 +22,7 @@ CREATE TABLE series (
created_at DATETIME DEFAULT CURRENT_TIMESTAMP created_at DATETIME DEFAULT CURRENT_TIMESTAMP
); );
CREATE TABLE posts ( CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
slug TEXT NOT NULL UNIQUE, slug TEXT NOT NULL UNIQUE,
title TEXT NOT NULL, title TEXT NOT NULL,
@@ -46,9 +39,10 @@ CREATE TABLE posts (
FOREIGN KEY (series_id) REFERENCES series(id) ON DELETE SET NULL FOREIGN KEY (series_id) REFERENCES series(id) ON DELETE SET NULL
); );
CREATE INDEX idx_posts_series_order ON posts(series_id, series_weight, published_at, id); CREATE INDEX IF NOT EXISTS idx_posts_series_order
ON posts(series_id, series_weight, published_at, id);
CREATE TABLE pages ( CREATE TABLE IF NOT EXISTS pages (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
slug TEXT NOT NULL UNIQUE, slug TEXT NOT NULL UNIQUE,
title TEXT NOT NULL, title TEXT NOT NULL,
@@ -59,12 +53,12 @@ CREATE TABLE pages (
FOREIGN KEY (author_id) REFERENCES users(id) FOREIGN KEY (author_id) REFERENCES users(id)
); );
CREATE TABLE tags ( CREATE TABLE IF NOT EXISTS tags (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE name TEXT NOT NULL UNIQUE
); );
CREATE TABLE post_tags ( CREATE TABLE IF NOT EXISTS post_tags (
post_id INTEGER NOT NULL, post_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL, tag_id INTEGER NOT NULL,
PRIMARY KEY (post_id, tag_id), PRIMARY KEY (post_id, tag_id),
@@ -72,14 +66,14 @@ CREATE TABLE post_tags (
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
); );
CREATE TABLE settings ( CREATE TABLE IF NOT EXISTS settings (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT NOT NULL UNIQUE, key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL, value TEXT NOT NULL,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
); );
CREATE TABLE attachments ( CREATE TABLE IF NOT EXISTS attachments (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL, filename TEXT NOT NULL,
key TEXT NOT NULL UNIQUE, key TEXT NOT NULL UNIQUE,
@@ -88,36 +82,56 @@ CREATE TABLE attachments (
created_at DATETIME DEFAULT CURRENT_TIMESTAMP created_at DATETIME DEFAULT CURRENT_TIMESTAMP
); );
-- Insert a default user INSERT OR IGNORE INTO users (username, password_hash) VALUES ('admin', 'admin');
INSERT INTO users (username, password_hash) VALUES ('admin', 'admin');
-- Insert default categories INSERT OR IGNORE INTO categories (name, slug) VALUES
INSERT INTO categories (name, slug) VALUES ('默认分类', 'uncategorized'), ('技术分享', 'tech'), ('生活随笔', 'life'); ('默认分类', 'uncategorized'),
('技术分享', 'tech'),
('生活随笔', 'life');
-- Insert dummy posts INSERT OR IGNORE INTO posts (slug, title, content, author_id, category_id) VALUES
INSERT INTO posts (slug, title, content, author_id, category_id) VALUES (
('hello-world', 'Hello, BlogFlare!', 'This is my first post on BlogFlare. 'hello-world',
'Hello, BlogFlare!',
'This is my first post on BlogFlare.
<!--more--> <!--more-->
Welcome to my new blog powered by **SvelteKit** and **Cloudflare D1**. Welcome to my new blog powered by **SvelteKit** and **Cloudflare D1**.
> [!NOTE] > [!NOTE]
> This is a DoIt style admonition! > This is a DoIt style admonition!
It is incredibly fast and cheap to host.', 1, 2), It is incredibly fast and cheap to host.',
('void-theme', 'The Beauty of VOID', 'Typography is essential. (SELECT id FROM users WHERE username = 'admin'),
(SELECT id FROM categories WHERE slug = 'tech')
),
(
'void-theme',
'The Beauty of VOID',
'Typography is essential.
<!--more--> <!--more-->
Typecho Theme VOID inspired this design. It uses a very clean layout.', 1, 2); Typecho Theme VOID inspired this design. It uses a very clean layout.',
(SELECT id FROM users WHERE username = 'admin'),
(SELECT id FROM categories WHERE slug = 'tech')
);
INSERT INTO tags (name) VALUES ('Welcome'), ('Design'); INSERT OR IGNORE INTO tags (name) VALUES ('Welcome'), ('Design');
INSERT INTO post_tags (post_id, tag_id) VALUES (1, 1), (2, 2);
-- Insert default aliases settings INSERT OR IGNORE INTO post_tags (post_id, tag_id) VALUES
INSERT INTO settings (key, value) VALUES (
(SELECT id FROM posts WHERE slug = 'hello-world'),
(SELECT id FROM tags WHERE name = 'Welcome')
),
(
(SELECT id FROM posts WHERE slug = 'void-theme'),
(SELECT id FROM tags WHERE name = 'Design')
);
INSERT OR IGNORE INTO settings (key, value) VALUES
('alias.post', '文章'), ('alias.post', '文章'),
('alias.category', '分类'), ('alias.category', '分类'),
('alias.tag', '标签'), ('alias.tag', '标签'),
('alias.series', '系列'), ('alias.series', '系列'),
('alias.page', '页面'), ('alias.page', '页面'),
('site.title', 'BlogFlare'), ('site.title', 'BlogFlare'),
('site.description', 'A high-performance blog powered by Cloudflare D1, R2, and KV.'), ('site.description', 'A high-performance blog powered by Cloudflare D1 and R2.'),
('r2.public_domain', 'https://assets.yourdomain.com'); ('r2.public_domain', 'https://assets.yourdomain.com');
+7 -5
View File
@@ -1,4 +1,8 @@
CREATE TABLE series ( -- Compatibility migration for installations that already used schema.sql.
-- The baseline now contains the final posts shape, so this migration must not
-- issue non-idempotent ALTER TABLE statements.
CREATE TABLE IF NOT EXISTS series (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE COLLATE NOCASE, name TEXT NOT NULL UNIQUE COLLATE NOCASE,
slug TEXT NOT NULL UNIQUE, slug TEXT NOT NULL UNIQUE,
@@ -6,9 +10,7 @@ CREATE TABLE series (
created_at DATETIME DEFAULT CURRENT_TIMESTAMP created_at DATETIME DEFAULT CURRENT_TIMESTAMP
); );
ALTER TABLE posts ADD COLUMN series_id INTEGER REFERENCES series(id) ON DELETE SET NULL; CREATE INDEX IF NOT EXISTS idx_posts_series_order
ALTER TABLE posts ADD COLUMN series_weight INTEGER; ON posts(series_id, series_weight, published_at, id);
CREATE INDEX idx_posts_series_order ON posts(series_id, series_weight, published_at, id);
INSERT OR IGNORE INTO settings (key, value) VALUES ('alias.series', '系列'); INSERT OR IGNORE INTO settings (key, value) VALUES ('alias.series', '系列');