|
18 | 18 | depends_on: Union[str, Sequence[str], None] = None |
19 | 19 |
|
20 | 20 |
|
| 21 | +def _index_exists(inspector, index_name, table_name): |
| 22 | + """Check if an index already exists on the given table.""" |
| 23 | + indexes = inspector.get_indexes(table_name) |
| 24 | + return any(idx['name'] == index_name for idx in indexes) |
| 25 | + |
| 26 | + |
21 | 27 | def upgrade() -> None: |
22 | | - op.create_table( |
23 | | - 'calendar', |
24 | | - sa.Column('id', sa.Text(), nullable=False), |
25 | | - sa.Column('user_id', sa.Text(), nullable=False), |
26 | | - sa.Column('name', sa.Text(), nullable=False), |
27 | | - sa.Column('color', sa.Text(), nullable=True), |
28 | | - sa.Column('is_default', sa.Boolean(), nullable=False), |
29 | | - sa.Column('data', sa.JSON(), nullable=True), |
30 | | - sa.Column('meta', sa.JSON(), nullable=True), |
31 | | - sa.Column('created_at', sa.BigInteger(), nullable=False), |
32 | | - sa.Column('updated_at', sa.BigInteger(), nullable=False), |
33 | | - sa.PrimaryKeyConstraint('id'), |
34 | | - ) |
35 | | - op.create_index('ix_calendar_user', 'calendar', ['user_id'], unique=False) |
36 | | - |
37 | | - op.create_table( |
38 | | - 'calendar_event', |
39 | | - sa.Column('id', sa.Text(), nullable=False), |
40 | | - sa.Column('calendar_id', sa.Text(), nullable=False), |
41 | | - sa.Column('user_id', sa.Text(), nullable=False), |
42 | | - sa.Column('title', sa.Text(), nullable=False), |
43 | | - sa.Column('description', sa.Text(), nullable=True), |
44 | | - sa.Column('start_at', sa.BigInteger(), nullable=False), |
45 | | - sa.Column('end_at', sa.BigInteger(), nullable=True), |
46 | | - sa.Column('all_day', sa.Boolean(), nullable=False), |
47 | | - sa.Column('rrule', sa.Text(), nullable=True), |
48 | | - sa.Column('color', sa.Text(), nullable=True), |
49 | | - sa.Column('location', sa.Text(), nullable=True), |
50 | | - sa.Column('data', sa.JSON(), nullable=True), |
51 | | - sa.Column('meta', sa.JSON(), nullable=True), |
52 | | - sa.Column('is_cancelled', sa.Boolean(), nullable=False), |
53 | | - sa.Column('created_at', sa.BigInteger(), nullable=False), |
54 | | - sa.Column('updated_at', sa.BigInteger(), nullable=False), |
55 | | - sa.PrimaryKeyConstraint('id'), |
56 | | - ) |
57 | | - op.create_index('ix_calendar_event_calendar', 'calendar_event', ['calendar_id', 'start_at'], unique=False) |
58 | | - op.create_index('ix_calendar_event_user_date', 'calendar_event', ['user_id', 'start_at'], unique=False) |
59 | | - |
60 | | - op.create_table( |
61 | | - 'calendar_event_attendee', |
62 | | - sa.Column('id', sa.Text(), nullable=False), |
63 | | - sa.Column('event_id', sa.Text(), nullable=False), |
64 | | - sa.Column('user_id', sa.Text(), nullable=False), |
65 | | - sa.Column('status', sa.Text(), nullable=False), |
66 | | - sa.Column('meta', sa.JSON(), nullable=True), |
67 | | - sa.Column('created_at', sa.BigInteger(), nullable=False), |
68 | | - sa.Column('updated_at', sa.BigInteger(), nullable=False), |
69 | | - sa.PrimaryKeyConstraint('id'), |
70 | | - sa.UniqueConstraint('event_id', 'user_id', name='uq_event_attendee'), |
71 | | - ) |
72 | | - op.create_index('ix_calendar_event_attendee_user', 'calendar_event_attendee', ['user_id', 'status'], unique=False) |
| 28 | + conn = op.get_bind() |
| 29 | + inspector = sa.inspect(conn) |
| 30 | + tables = inspector.get_table_names() |
| 31 | + |
| 32 | + if 'calendar' not in tables: |
| 33 | + op.create_table( |
| 34 | + 'calendar', |
| 35 | + sa.Column('id', sa.Text(), nullable=False), |
| 36 | + sa.Column('user_id', sa.Text(), nullable=False), |
| 37 | + sa.Column('name', sa.Text(), nullable=False), |
| 38 | + sa.Column('color', sa.Text(), nullable=True), |
| 39 | + sa.Column('is_default', sa.Boolean(), nullable=False), |
| 40 | + sa.Column('data', sa.JSON(), nullable=True), |
| 41 | + sa.Column('meta', sa.JSON(), nullable=True), |
| 42 | + sa.Column('created_at', sa.BigInteger(), nullable=False), |
| 43 | + sa.Column('updated_at', sa.BigInteger(), nullable=False), |
| 44 | + sa.PrimaryKeyConstraint('id'), |
| 45 | + ) |
| 46 | + |
| 47 | + if 'calendar' in inspector.get_table_names(): |
| 48 | + if not _index_exists(inspector, 'ix_calendar_user', 'calendar'): |
| 49 | + op.create_index('ix_calendar_user', 'calendar', ['user_id'], unique=False) |
| 50 | + |
| 51 | + if 'calendar_event' not in tables: |
| 52 | + op.create_table( |
| 53 | + 'calendar_event', |
| 54 | + sa.Column('id', sa.Text(), nullable=False), |
| 55 | + sa.Column('calendar_id', sa.Text(), nullable=False), |
| 56 | + sa.Column('user_id', sa.Text(), nullable=False), |
| 57 | + sa.Column('title', sa.Text(), nullable=False), |
| 58 | + sa.Column('description', sa.Text(), nullable=True), |
| 59 | + sa.Column('start_at', sa.BigInteger(), nullable=False), |
| 60 | + sa.Column('end_at', sa.BigInteger(), nullable=True), |
| 61 | + sa.Column('all_day', sa.Boolean(), nullable=False), |
| 62 | + sa.Column('rrule', sa.Text(), nullable=True), |
| 63 | + sa.Column('color', sa.Text(), nullable=True), |
| 64 | + sa.Column('location', sa.Text(), nullable=True), |
| 65 | + sa.Column('data', sa.JSON(), nullable=True), |
| 66 | + sa.Column('meta', sa.JSON(), nullable=True), |
| 67 | + sa.Column('is_cancelled', sa.Boolean(), nullable=False), |
| 68 | + sa.Column('created_at', sa.BigInteger(), nullable=False), |
| 69 | + sa.Column('updated_at', sa.BigInteger(), nullable=False), |
| 70 | + sa.PrimaryKeyConstraint('id'), |
| 71 | + ) |
| 72 | + |
| 73 | + if 'calendar_event' in inspector.get_table_names(): |
| 74 | + if not _index_exists(inspector, 'ix_calendar_event_calendar', 'calendar_event'): |
| 75 | + op.create_index('ix_calendar_event_calendar', 'calendar_event', ['calendar_id', 'start_at'], unique=False) |
| 76 | + if not _index_exists(inspector, 'ix_calendar_event_user_date', 'calendar_event'): |
| 77 | + op.create_index('ix_calendar_event_user_date', 'calendar_event', ['user_id', 'start_at'], unique=False) |
| 78 | + |
| 79 | + if 'calendar_event_attendee' not in tables: |
| 80 | + op.create_table( |
| 81 | + 'calendar_event_attendee', |
| 82 | + sa.Column('id', sa.Text(), nullable=False), |
| 83 | + sa.Column('event_id', sa.Text(), nullable=False), |
| 84 | + sa.Column('user_id', sa.Text(), nullable=False), |
| 85 | + sa.Column('status', sa.Text(), nullable=False), |
| 86 | + sa.Column('meta', sa.JSON(), nullable=True), |
| 87 | + sa.Column('created_at', sa.BigInteger(), nullable=False), |
| 88 | + sa.Column('updated_at', sa.BigInteger(), nullable=False), |
| 89 | + sa.PrimaryKeyConstraint('id'), |
| 90 | + sa.UniqueConstraint('event_id', 'user_id', name='uq_event_attendee'), |
| 91 | + ) |
| 92 | + |
| 93 | + if 'calendar_event_attendee' in inspector.get_table_names(): |
| 94 | + if not _index_exists(inspector, 'ix_calendar_event_attendee_user', 'calendar_event_attendee'): |
| 95 | + op.create_index('ix_calendar_event_attendee_user', 'calendar_event_attendee', ['user_id', 'status'], unique=False) |
73 | 96 |
|
74 | 97 |
|
75 | 98 | def downgrade() -> None: |
|
0 commit comments