Skip to content

Commit 1a4dcea

Browse files
🎨 improve DB foreign key dependencies (🗃️) (#6428)
1 parent 65ffdd9 commit 1a4dcea

11 files changed

+274
-33
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
"""improve foreign key dependencies
2+
3+
Revision ID: 10729e07000d
4+
Revises: 47ca7335e146
5+
Create Date: 2024-09-24 07:52:20.253076+00:00
6+
7+
"""
8+
from alembic import op
9+
10+
# revision identifiers, used by Alembic.
11+
revision = "10729e07000d"
12+
down_revision = "47ca7335e146"
13+
branch_labels = None
14+
depends_on = None
15+
16+
17+
def upgrade():
18+
# ### commands auto generated by Alembic - please adjust! ###
19+
op.create_foreign_key(
20+
"fk_rut_pricing_plan_to_service_key_and_version",
21+
"resource_tracker_pricing_plan_to_service",
22+
"services_meta_data",
23+
["service_key", "service_version"],
24+
["key", "version"],
25+
onupdate="CASCADE",
26+
ondelete="CASCADE",
27+
)
28+
op.drop_index(
29+
"ix_resource_tracker_pricing_plans_product_name",
30+
table_name="resource_tracker_pricing_plans",
31+
)
32+
op.create_foreign_key(
33+
"fk_rut_pricing_plans_product_name",
34+
"resource_tracker_pricing_plans",
35+
"products",
36+
["product_name"],
37+
["name"],
38+
onupdate="CASCADE",
39+
ondelete="CASCADE",
40+
)
41+
op.create_foreign_key(
42+
"fk_resource_tracker_pricing_units_costs_pricing_plan_id",
43+
"resource_tracker_pricing_unit_costs",
44+
"resource_tracker_pricing_plans",
45+
["pricing_plan_id"],
46+
["pricing_plan_id"],
47+
onupdate="CASCADE",
48+
ondelete="CASCADE",
49+
)
50+
op.create_foreign_key(
51+
"fk_resource_tracker_pricing_units_costs_pricing_unit_id",
52+
"resource_tracker_pricing_unit_costs",
53+
"resource_tracker_pricing_units",
54+
["pricing_unit_id"],
55+
["pricing_unit_id"],
56+
onupdate="CASCADE",
57+
ondelete="CASCADE",
58+
)
59+
op.create_foreign_key(
60+
"fk_wallets_product_name",
61+
"wallets",
62+
"products",
63+
["product_name"],
64+
["name"],
65+
onupdate="CASCADE",
66+
ondelete="CASCADE",
67+
)
68+
op.create_foreign_key(
69+
"fk_workspaces_product_name",
70+
"workspaces",
71+
"products",
72+
["product_name"],
73+
["name"],
74+
onupdate="CASCADE",
75+
ondelete="CASCADE",
76+
)
77+
# ### end Alembic commands ###
78+
79+
80+
def downgrade():
81+
# ### commands auto generated by Alembic - please adjust! ###
82+
op.drop_constraint("fk_workspaces_product_name", "workspaces", type_="foreignkey")
83+
op.drop_constraint("fk_wallets_product_name", "wallets", type_="foreignkey")
84+
op.drop_constraint(
85+
"fk_resource_tracker_pricing_units_costs_pricing_unit_id",
86+
"resource_tracker_pricing_unit_costs",
87+
type_="foreignkey",
88+
)
89+
op.drop_constraint(
90+
"fk_resource_tracker_pricing_units_costs_pricing_plan_id",
91+
"resource_tracker_pricing_unit_costs",
92+
type_="foreignkey",
93+
)
94+
op.drop_constraint(
95+
"fk_rut_pricing_plans_product_name",
96+
"resource_tracker_pricing_plans",
97+
type_="foreignkey",
98+
)
99+
op.create_index(
100+
"ix_resource_tracker_pricing_plans_product_name",
101+
"resource_tracker_pricing_plans",
102+
["product_name"],
103+
unique=False,
104+
)
105+
op.drop_constraint(
106+
"fk_rut_pricing_plan_to_service_key_and_version",
107+
"resource_tracker_pricing_plan_to_service",
108+
type_="foreignkey",
109+
)
110+
# ### end Alembic commands ###

packages/postgres-database/src/simcore_postgres_database/models/resource_tracker_pricing_plan_to_service.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@
4545
doc="Option to mark default pricing plan for the service (ex. when there are more pricing plans for the same service)",
4646
),
4747
# ---------------------------
48+
sa.ForeignKeyConstraint(
49+
["service_key", "service_version"],
50+
["services_meta_data.key", "services_meta_data.version"],
51+
name="fk_rut_pricing_plan_to_service_key_and_version",
52+
onupdate="CASCADE",
53+
ondelete="CASCADE",
54+
),
4855
)

packages/postgres-database/src/simcore_postgres_database/models/resource_tracker_pricing_plans.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,14 @@ class PricingPlanClassification(str, enum.Enum):
3333
sa.Column(
3434
"product_name",
3535
sa.String,
36+
sa.ForeignKey(
37+
"products.name",
38+
onupdate="CASCADE",
39+
ondelete="CASCADE",
40+
name="fk_rut_pricing_plans_product_name",
41+
),
3642
nullable=False,
37-
doc="Product name",
38-
index=True,
43+
doc="Products unique name",
3944
),
4045
sa.Column(
4146
"display_name",

packages/postgres-database/src/simcore_postgres_database/models/resource_tracker_pricing_unit_costs.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,14 @@
2222
sa.Column(
2323
"pricing_plan_id",
2424
sa.BigInteger,
25+
sa.ForeignKey(
26+
"resource_tracker_pricing_plans.pricing_plan_id",
27+
name="fk_resource_tracker_pricing_units_costs_pricing_plan_id",
28+
onupdate="CASCADE",
29+
ondelete="CASCADE",
30+
),
2531
nullable=False,
26-
doc="Parent pricing plan",
32+
doc="Foreign key to pricing plan",
2733
index=True,
2834
),
2935
sa.Column(
@@ -35,8 +41,14 @@
3541
sa.Column(
3642
"pricing_unit_id",
3743
sa.BigInteger,
44+
sa.ForeignKey(
45+
"resource_tracker_pricing_units.pricing_unit_id",
46+
name="fk_resource_tracker_pricing_units_costs_pricing_unit_id",
47+
onupdate="CASCADE",
48+
ondelete="CASCADE",
49+
),
3850
nullable=False,
39-
doc="Parent pricing unit",
51+
doc="Foreign key to pricing unit",
4052
index=True,
4153
),
4254
sa.Column(

packages/postgres-database/src/simcore_postgres_database/models/wallets.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,18 @@ class WalletStatus(str, enum.Enum):
5050
),
5151
column_created_datetime(timezone=True),
5252
column_modified_datetime(timezone=True),
53-
sa.Column("product_name", sa.String, nullable=False, doc="Product name"),
53+
sa.Column(
54+
"product_name",
55+
sa.String,
56+
sa.ForeignKey(
57+
"products.name",
58+
onupdate="CASCADE",
59+
ondelete="CASCADE",
60+
name="fk_wallets_product_name",
61+
),
62+
nullable=False,
63+
doc="Products unique name",
64+
),
5465
)
5566

5667
# ------------------------ TRIGGERS

packages/postgres-database/src/simcore_postgres_database/models/workspaces.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,18 @@
3434
nullable=False,
3535
doc="Identifier of the group that owns this workspace (Should be just PRIMARY GROUP)",
3636
),
37-
sa.Column("product_name", sa.String, nullable=False, doc="Product name"),
37+
sa.Column(
38+
"product_name",
39+
sa.String,
40+
sa.ForeignKey(
41+
"products.name",
42+
onupdate="CASCADE",
43+
ondelete="CASCADE",
44+
name="fk_workspaces_product_name",
45+
),
46+
nullable=False,
47+
doc="Products unique name",
48+
),
3849
column_created_datetime(timezone=True),
3950
column_modified_datetime(timezone=True),
4051
)

services/resource-usage-tracker/tests/unit/with_dbs/test_api_resource_tracker_pricing_plans.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from simcore_postgres_database.models.resource_tracker_pricing_units import (
2828
resource_tracker_pricing_units,
2929
)
30+
from simcore_postgres_database.models.services import services_meta_data
3031
from starlette import status
3132
from yarl import URL
3233

@@ -184,6 +185,15 @@ def resource_tracker_pricing_tables_db(postgres_db: sa.engine.Engine) -> Iterato
184185
modified=datetime.now(tz=timezone.utc),
185186
)
186187
)
188+
189+
con.execute(
190+
services_meta_data.insert().values(
191+
key=_SERVICE_KEY,
192+
version=_SERVICE_VERSION,
193+
name="name",
194+
description="description",
195+
)
196+
)
187197
con.execute(
188198
resource_tracker_pricing_plan_to_service.insert().values(
189199
pricing_plan_id=_PRICING_PLAN_ID,
@@ -192,6 +202,15 @@ def resource_tracker_pricing_tables_db(postgres_db: sa.engine.Engine) -> Iterato
192202
service_default_plan=True,
193203
)
194204
)
205+
206+
con.execute(
207+
services_meta_data.insert().values(
208+
key=_SERVICE_KEY_2,
209+
version=_SERVICE_VERSION_2,
210+
name="name",
211+
description="description",
212+
)
213+
)
195214
con.execute(
196215
resource_tracker_pricing_plan_to_service.insert().values(
197216
pricing_plan_id=_PRICING_PLAN_ID_2,
@@ -207,6 +226,7 @@ def resource_tracker_pricing_tables_db(postgres_db: sa.engine.Engine) -> Iterato
207226
con.execute(resource_tracker_pricing_units.delete())
208227
con.execute(resource_tracker_pricing_plans.delete())
209228
con.execute(resource_tracker_pricing_unit_costs.delete())
229+
con.execute(services_meta_data.delete())
210230

211231

212232
async def test_get_default_pricing_plan_for_service(

0 commit comments

Comments
 (0)