11from datetime import datetime
22
3+ from sqlalchemy import Index
4+
35from app import db
46
57
8+ # https://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key
69category_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
1014subcategory_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
1520class 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