Internal
Public Access
Fix PostgreSQL compatibility in migrations
- tasks.0002_initial: Remove duplicate user field on Tag model - tasks.0005_fix_tasks_tags_table: Add PostgreSQL/MySQL/SQLite support - Use SERIAL instead of AUTOINCREMENT for PostgreSQL - Use UUID type for foreign keys in PostgreSQL - tasks.0006_fix_task_shares_table: Add PostgreSQL/MySQL/SQLite support - Use UUID type and TIMESTAMP in PostgreSQL - Use CHAR(32) and DATETIME in MySQL/SQLite These migrations now detect the database backend and use appropriate syntax for each database type. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.5
parent
4e903b688d
commit
0cb1e9508f
@@ -10,30 +10,82 @@ def fix_task_shares_table(apps, schema_editor):
|
||||
"""
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
# Check database type
|
||||
is_postgres = schema_editor.connection.vendor == 'postgresql'
|
||||
is_mysql = schema_editor.connection.vendor == 'mysql'
|
||||
|
||||
# Drop and recreate the task_shares table with correct foreign keys
|
||||
schema_editor.execute(
|
||||
"DROP TABLE IF EXISTS task_shares;"
|
||||
"DROP TABLE IF EXISTS task_shares CASCADE;" if is_postgres else "DROP TABLE IF EXISTS task_shares;"
|
||||
)
|
||||
|
||||
schema_editor.execute(
|
||||
"""
|
||||
CREATE TABLE task_shares (
|
||||
id CHAR(32) NOT NULL PRIMARY KEY,
|
||||
permission VARCHAR(20) NOT NULL,
|
||||
sync_id CHAR(32) NOT NULL UNIQUE,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
owner_id CHAR(32) NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED,
|
||||
shared_with_id CHAR(32) NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED,
|
||||
task_id CHAR(32) NULL REFERENCES tasks(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
|
||||
tag_id CHAR(32) NULL REFERENCES tags(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
|
||||
CONSTRAINT share_task_or_tag_not_both CHECK (
|
||||
(tag_id IS NULL AND task_id IS NOT NULL) OR
|
||||
(tag_id IS NOT NULL AND task_id IS NULL)
|
||||
)
|
||||
);
|
||||
"""
|
||||
)
|
||||
if is_postgres:
|
||||
# PostgreSQL syntax
|
||||
schema_editor.execute(
|
||||
"""
|
||||
CREATE TABLE task_shares (
|
||||
id UUID NOT NULL PRIMARY KEY,
|
||||
permission VARCHAR(20) NOT NULL,
|
||||
sync_id UUID NOT NULL UNIQUE,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL,
|
||||
owner_id UUID NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED,
|
||||
shared_with_id UUID NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED,
|
||||
task_id UUID NULL REFERENCES tasks(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
|
||||
tag_id UUID NULL REFERENCES tags(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
|
||||
CONSTRAINT share_task_or_tag_not_both CHECK (
|
||||
(tag_id IS NULL AND task_id IS NOT NULL) OR
|
||||
(tag_id IS NOT NULL AND task_id IS NULL)
|
||||
)
|
||||
);
|
||||
"""
|
||||
)
|
||||
elif is_mysql:
|
||||
# MySQL/MariaDB syntax
|
||||
schema_editor.execute(
|
||||
"""
|
||||
CREATE TABLE task_shares (
|
||||
id CHAR(32) NOT NULL PRIMARY KEY,
|
||||
permission VARCHAR(20) NOT NULL,
|
||||
sync_id CHAR(32) NOT NULL UNIQUE,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
owner_id CHAR(32) NOT NULL,
|
||||
shared_with_id CHAR(32) NOT NULL,
|
||||
task_id CHAR(32) NULL,
|
||||
tag_id CHAR(32) NULL,
|
||||
CONSTRAINT share_task_or_tag_not_both CHECK (
|
||||
(tag_id IS NULL AND task_id IS NOT NULL) OR
|
||||
(tag_id IS NOT NULL AND task_id IS NULL)
|
||||
),
|
||||
FOREIGN KEY (owner_id) REFERENCES users(id),
|
||||
FOREIGN KEY (shared_with_id) REFERENCES users(id),
|
||||
FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
|
||||
);
|
||||
"""
|
||||
)
|
||||
else:
|
||||
# SQLite syntax (default)
|
||||
schema_editor.execute(
|
||||
"""
|
||||
CREATE TABLE task_shares (
|
||||
id CHAR(32) NOT NULL PRIMARY KEY,
|
||||
permission VARCHAR(20) NOT NULL,
|
||||
sync_id CHAR(32) NOT NULL UNIQUE,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
owner_id CHAR(32) NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED,
|
||||
shared_with_id CHAR(32) NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED,
|
||||
task_id CHAR(32) NULL REFERENCES tasks(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
|
||||
tag_id CHAR(32) NULL REFERENCES tags(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
|
||||
CONSTRAINT share_task_or_tag_not_both CHECK (
|
||||
(tag_id IS NULL AND task_id IS NOT NULL) OR
|
||||
(tag_id IS NOT NULL AND task_id IS NULL)
|
||||
)
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
# Create indexes for foreign keys
|
||||
schema_editor.execute(
|
||||
|
||||
Reference in New Issue
Block a user