Skip to content

Commit 091006e

Browse files
committed
add USING, conditional ALTERs
1 parent e0789c3 commit 091006e

File tree

1 file changed

+57
-19
lines changed

1 file changed

+57
-19
lines changed

api/app_analytics/migrations/0007_labels_jsonb.py

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,62 @@ class Migration(migrations.Migration):
1010
]
1111

1212
operations = [
13-
migrations.AlterField(
14-
model_name="apiusagebucket",
15-
name="labels",
16-
field=models.JSONField(default=dict),
17-
),
18-
migrations.AlterField(
19-
model_name="apiusageraw",
20-
name="labels",
21-
field=models.JSONField(default=dict),
22-
),
23-
migrations.AlterField(
24-
model_name="featureevaluationbucket",
25-
name="labels",
26-
field=models.JSONField(default=dict),
27-
),
28-
migrations.AlterField(
29-
model_name="featureevaluationraw",
30-
name="labels",
31-
field=models.JSONField(default=dict),
13+
migrations.SeparateDatabaseAndState(
14+
state_operations=[
15+
migrations.AlterField(
16+
model_name="apiusagebucket",
17+
name="labels",
18+
field=models.JSONField(default=dict),
19+
),
20+
migrations.AlterField(
21+
model_name="apiusageraw",
22+
name="labels",
23+
field=models.JSONField(default=dict),
24+
),
25+
migrations.AlterField(
26+
model_name="featureevaluationbucket",
27+
name="labels",
28+
field=models.JSONField(default=dict),
29+
),
30+
migrations.AlterField(
31+
model_name="featureevaluationraw",
32+
name="labels",
33+
field=models.JSONField(default=dict),
34+
),
35+
],
36+
database_operations=[
37+
migrations.RunSQL(
38+
# Only alter the columns that are currently hstore.
39+
# See 0006_add_labels to understand why we are doing this.
40+
sql="""
41+
DO $$
42+
BEGIN
43+
FOR relname IN
44+
SELECT c.relname
45+
FROM pg_class c
46+
JOIN pg_attribute a ON a.attrelid = c.oid
47+
JOIN pg_type t ON a.atttypid = t.oid
48+
WHERE c.relname IN (
49+
'app_analytics_apiusagebucket',
50+
'app_analytics_apiusageraw',
51+
'app_analytics_featureevaluationbucket',
52+
'app_analytics_featureevaluationraw'
53+
)
54+
AND a.attname = 'labels'
55+
AND t.typname = 'hstore'
56+
LOOP
57+
EXECUTE format(
58+
'ALTER TABLE %I
59+
ALTER COLUMN labels TYPE jsonb USING hstore_to_json(labels),
60+
ALTER COLUMN labels SET DEFAULT ''{}''::jsonb',
61+
relname
62+
);
63+
END LOOP;
64+
END
65+
$$;
66+
""",
67+
reverse_sql="",
68+
),
69+
],
3270
),
3371
]

0 commit comments

Comments
 (0)