diff --git a/schema.sql b/migrations/0000_initial.sql similarity index 50% rename from schema.sql rename to migrations/0000_initial.sql index 5b4b114..3790150 100644 --- a/schema.sql +++ b/migrations/0000_initial.sql @@ -1,27 +1,20 @@ -DROP TABLE IF EXISTS post_tags; -DROP TABLE IF EXISTS posts; -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; +-- BlogFlare baseline. This migration is safe to apply to a fresh database and +-- to databases previously initialized from the legacy schema.sql file. -CREATE TABLE users ( +CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -CREATE TABLE categories ( +CREATE TABLE IF NOT EXISTS categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, slug TEXT NOT NULL UNIQUE ); -CREATE TABLE series ( +CREATE TABLE IF NOT EXISTS series ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE COLLATE NOCASE, slug TEXT NOT NULL UNIQUE, @@ -29,7 +22,7 @@ CREATE TABLE series ( created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -CREATE TABLE posts ( +CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, slug TEXT NOT NULL UNIQUE, title TEXT NOT NULL, @@ -46,9 +39,10 @@ CREATE TABLE posts ( 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, slug TEXT NOT NULL UNIQUE, title TEXT NOT NULL, @@ -59,12 +53,12 @@ CREATE TABLE pages ( FOREIGN KEY (author_id) REFERENCES users(id) ); -CREATE TABLE tags ( +CREATE TABLE IF NOT EXISTS tags ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE ); -CREATE TABLE post_tags ( +CREATE TABLE IF NOT EXISTS post_tags ( post_id INTEGER NOT NULL, tag_id INTEGER NOT NULL, PRIMARY KEY (post_id, tag_id), @@ -72,14 +66,14 @@ CREATE TABLE post_tags ( FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE ); -CREATE TABLE settings ( +CREATE TABLE IF NOT EXISTS settings ( id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL UNIQUE, value TEXT NOT NULL, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -CREATE TABLE attachments ( +CREATE TABLE IF NOT EXISTS attachments ( id INTEGER PRIMARY KEY AUTOINCREMENT, filename TEXT NOT NULL, key TEXT NOT NULL UNIQUE, @@ -88,36 +82,56 @@ CREATE TABLE attachments ( created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); --- Insert a default user -INSERT INTO users (username, password_hash) VALUES ('admin', 'admin'); +INSERT OR IGNORE INTO users (username, password_hash) VALUES ('admin', 'admin'); --- Insert default categories -INSERT INTO categories (name, slug) VALUES ('默认分类', 'uncategorized'), ('技术分享', 'tech'), ('生活随笔', 'life'); +INSERT OR IGNORE INTO categories (name, slug) VALUES + ('默认分类', 'uncategorized'), + ('技术分享', 'tech'), + ('生活随笔', 'life'); --- Insert dummy posts -INSERT INTO posts (slug, title, content, author_id, category_id) VALUES -('hello-world', 'Hello, BlogFlare!', 'This is my first post on BlogFlare. +INSERT OR IGNORE INTO posts (slug, title, content, author_id, category_id) VALUES + ( + 'hello-world', + 'Hello, BlogFlare!', + 'This is my first post on BlogFlare. Welcome to my new blog powered by **SvelteKit** and **Cloudflare D1**. > [!NOTE] > This is a DoIt style admonition! -It is incredibly fast and cheap to host.', 1, 2), -('void-theme', 'The Beauty of VOID', 'Typography is essential. +It is incredibly fast and cheap to host.', + (SELECT id FROM users WHERE username = 'admin'), + (SELECT id FROM categories WHERE slug = 'tech') + ), + ( + 'void-theme', + 'The Beauty of VOID', + 'Typography is essential. -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 INTO post_tags (post_id, tag_id) VALUES (1, 1), (2, 2); +INSERT OR IGNORE INTO tags (name) VALUES ('Welcome'), ('Design'); --- Insert default aliases settings -INSERT INTO settings (key, value) VALUES -('alias.post', '文章'), -('alias.category', '分类'), -('alias.tag', '标签'), -('alias.series', '系列'), -('alias.page', '页面'), -('site.title', 'BlogFlare'), -('site.description', 'A high-performance blog powered by Cloudflare D1, R2, and KV.'), -('r2.public_domain', 'https://assets.yourdomain.com'); +INSERT OR IGNORE INTO post_tags (post_id, tag_id) 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.category', '分类'), + ('alias.tag', '标签'), + ('alias.series', '系列'), + ('alias.page', '页面'), + ('site.title', 'BlogFlare'), + ('site.description', 'A high-performance blog powered by Cloudflare D1 and R2.'), + ('r2.public_domain', 'https://assets.yourdomain.com'); diff --git a/migrations/0001_add_series.sql b/migrations/0001_add_series.sql index 4b9c4cf..66a5222 100644 --- a/migrations/0001_add_series.sql +++ b/migrations/0001_add_series.sql @@ -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, name TEXT NOT NULL UNIQUE COLLATE NOCASE, slug TEXT NOT NULL UNIQUE, @@ -6,9 +10,7 @@ CREATE TABLE series ( created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -ALTER TABLE posts ADD COLUMN series_id INTEGER REFERENCES series(id) ON DELETE SET NULL; -ALTER TABLE posts ADD COLUMN series_weight INTEGER; - -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); INSERT OR IGNORE INTO settings (key, value) VALUES ('alias.series', '系列');