5
5
6
6
from piccolo .apps .migrations .auto .operations import (
7
7
AddColumn ,
8
+ AddConstraint ,
8
9
AlterColumn ,
9
10
DropColumn ,
11
+ DropConstraint ,
10
12
)
11
13
from piccolo .apps .migrations .auto .serialisation import (
12
14
deserialise_params ,
13
15
serialise_params ,
14
16
)
15
17
from piccolo .columns .base import Column
18
+ from piccolo .constraint import Constraint
16
19
from piccolo .table import Table , create_table_class
17
20
18
21
@@ -55,6 +58,8 @@ class TableDelta:
55
58
add_columns : t .List [AddColumn ] = field (default_factory = list )
56
59
drop_columns : t .List [DropColumn ] = field (default_factory = list )
57
60
alter_columns : t .List [AlterColumn ] = field (default_factory = list )
61
+ add_constraints : t .List [AddConstraint ] = field (default_factory = list )
62
+ drop_constraints : t .List [DropConstraint ] = field (default_factory = list )
58
63
59
64
def __eq__ (self , value : TableDelta ) -> bool : # type: ignore
60
65
"""
@@ -85,6 +90,19 @@ def __eq__(self, value) -> bool:
85
90
return False
86
91
87
92
93
+ @dataclass
94
+ class ConstraintComparison :
95
+ constraint : Constraint
96
+
97
+ def __hash__ (self ) -> int :
98
+ return self .constraint .__hash__ ()
99
+
100
+ def __eq__ (self , value ) -> bool :
101
+ if isinstance (value , ConstraintComparison ):
102
+ return self .constraint ._meta .name == value .constraint ._meta .name
103
+ return False
104
+
105
+
88
106
@dataclass
89
107
class DiffableTable :
90
108
"""
@@ -96,6 +114,7 @@ class DiffableTable:
96
114
tablename : str
97
115
schema : t .Optional [str ] = None
98
116
columns : t .List [Column ] = field (default_factory = list )
117
+ constraints : t .List [Constraint ] = field (default_factory = list )
99
118
previous_class_name : t .Optional [str ] = None
100
119
101
120
def __post_init__ (self ) -> None :
@@ -189,10 +208,54 @@ def __sub__(self, value: DiffableTable) -> TableDelta:
189
208
)
190
209
)
191
210
211
+ add_constraints = [
212
+ AddConstraint (
213
+ table_class_name = self .class_name ,
214
+ constraint_name = i .constraint ._meta .name ,
215
+ constraint_class_name = i .constraint .__class__ .__name__ ,
216
+ constraint_class = i .constraint .__class__ ,
217
+ params = i .constraint ._meta .params ,
218
+ schema = self .schema ,
219
+ )
220
+ for i in sorted (
221
+ {
222
+ ConstraintComparison (constraint = constraint )
223
+ for constraint in self .constraints
224
+ }
225
+ - {
226
+ ConstraintComparison (constraint = constraint )
227
+ for constraint in value .constraints
228
+ },
229
+ key = lambda x : x .constraint ._meta .name ,
230
+ )
231
+ ]
232
+
233
+ drop_constraints = [
234
+ DropConstraint (
235
+ table_class_name = self .class_name ,
236
+ constraint_name = i .constraint ._meta .name ,
237
+ tablename = value .tablename ,
238
+ schema = self .schema ,
239
+ )
240
+ for i in sorted (
241
+ {
242
+ ConstraintComparison (constraint = constraint )
243
+ for constraint in value .constraints
244
+ }
245
+ - {
246
+ ConstraintComparison (constraint = constraint )
247
+ for constraint in self .constraints
248
+ },
249
+ key = lambda x : x .constraint ._meta .name ,
250
+ )
251
+ ]
252
+
192
253
return TableDelta (
193
254
add_columns = add_columns ,
194
255
drop_columns = drop_columns ,
195
256
alter_columns = alter_columns ,
257
+ add_constraints = add_constraints ,
258
+ drop_constraints = drop_constraints ,
196
259
)
197
260
198
261
def __hash__ (self ) -> int :
@@ -218,10 +281,14 @@ def to_table_class(self) -> t.Type[Table]:
218
281
"""
219
282
Converts the DiffableTable into a Table subclass.
220
283
"""
284
+ class_members : t .Dict [str , t .Any ] = {}
285
+ for column in self .columns :
286
+ class_members [column ._meta .name ] = column
287
+ for constraint in self .constraints :
288
+ class_members [constraint ._meta .name ] = constraint
289
+
221
290
return create_table_class (
222
291
class_name = self .class_name ,
223
292
class_kwargs = {"tablename" : self .tablename , "schema" : self .schema },
224
- class_members = {
225
- column ._meta .name : column for column in self .columns
226
- },
293
+ class_members = class_members ,
227
294
)
0 commit comments