Skip to content

Commit ec45e7e

Browse files
add cascading updates and deletes, primary keys, indexes, not nulls
1 parent 54cd39e commit ec45e7e

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

app/models.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
from datetime import datetime
22

3+
from sqlalchemy import Index
4+
35
from app import db
46

57

8+
# https://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key
69
category_subcategory = db.Table("category_subcategory",
7-
db.Column("category_id", db.Integer, db.ForeignKey("category.id")),
8-
db.Column("subcategory_id", db.Integer, db.ForeignKey("subcategory.id")))
10+
db.Column("category_id", db.Integer, db.ForeignKey("category.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
11+
db.Column("subcategory_id", db.Integer, db.ForeignKey("subcategory.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
12+
Index("category_subcategory_subcategory_id_idx", "subcategory_id", "category_id"))
913

1014
subcategory_product = db.Table("subcategory_product",
11-
db.Column("subcategory_id", db.Integer, db.ForeignKey("subcategory.id")),
12-
db.Column("product_id", db.Integer, db.ForeignKey("product.id")))
15+
db.Column("subcategory_id", db.Integer, db.ForeignKey("subcategory.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
16+
db.Column("product_id", db.Integer, db.ForeignKey("product.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
17+
Index("subcategory_product_product_id_idx", "product_id", "subcategory_id"))
1318

1419

1520
class Category(db.Model):
1621
__tablename__ = 'category'
1722
id = db.Column(db.Integer, primary_key=True)
18-
name = db.Column(db.String(200), nullable=False, unique=True)
19-
created_at = db.Column(db.DateTime, default=datetime.utcnow)
20-
subcategories = db.relationship("Subcategory", secondary=category_subcategory, back_populates="categories", lazy='dynamic')
23+
name = db.Column(db.String(200), nullable=False, unique=True) # unique automatically creates a unique index
24+
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
25+
subcategories = db.relationship("Subcategory", secondary=category_subcategory, back_populates="categories", lazy='dynamic', passive_deletes=True)
2126

2227
def to_json(self):
2328
return {
@@ -32,9 +37,9 @@ class Subcategory(db.Model):
3237
__tablename__ = 'subcategory'
3338
id = db.Column(db.Integer, primary_key=True)
3439
name = db.Column(db.String(200), nullable=False, unique=True)
35-
created_at = db.Column(db.DateTime, default=datetime.utcnow)
36-
categories = db.relationship("Category", secondary=category_subcategory, back_populates="subcategories", lazy='dynamic')
37-
products = db.relationship("Product", secondary=subcategory_product, back_populates="subcategories", lazy='dynamic')
40+
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
41+
categories = db.relationship("Category", secondary=category_subcategory, back_populates="subcategories", lazy='dynamic', passive_deletes=True)
42+
products = db.relationship("Product", secondary=subcategory_product, back_populates="subcategories", lazy='dynamic', passive_deletes=True)
3843

3944
def to_json(self):
4045
return {
@@ -51,8 +56,8 @@ class Product(db.Model):
5156
id = db.Column(db.Integer, primary_key=True)
5257
name = db.Column(db.String(200), nullable=False, unique=True)
5358
description = db.Column(db.String(500))
54-
created_at = db.Column(db.DateTime, default=datetime.utcnow)
55-
subcategories = db.relationship("Subcategory", secondary=subcategory_product, back_populates="products", lazy='dynamic')
59+
created_at = db.Column(db.DateTime, nullable=False ,default=datetime.utcnow)
60+
subcategories = db.relationship("Subcategory", secondary=subcategory_product, back_populates="products", lazy='dynamic', passive_deletes=True)
5661

5762
def to_json(self):
5863
return {

0 commit comments

Comments
 (0)