11
11
{},
12
12
[
13
13
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [age] TEXT\n );" ,
14
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
14
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
15
15
"DROP TABLE [dogs];" ,
16
16
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
17
17
],
21
21
{"types" : {"age" : int }},
22
22
[
23
23
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [age] INTEGER\n );" ,
24
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
24
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
25
25
"DROP TABLE [dogs];" ,
26
26
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
27
27
],
31
31
{"rename" : {"age" : "dog_age" }},
32
32
[
33
33
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [dog_age] TEXT\n );" ,
34
- "INSERT INTO [dogs_new_suffix] ([id], [name], [dog_age])\n SELECT [id], [name], [age] FROM [dogs];" ,
34
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [dog_age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
35
35
"DROP TABLE [dogs];" ,
36
36
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
37
37
],
41
41
{"drop" : ["age" ]},
42
42
[
43
43
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT\n );" ,
44
- "INSERT INTO [dogs_new_suffix] ([id], [name])\n SELECT [id], [name] FROM [dogs];" ,
44
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name])\n SELECT [rowid], [id], [name] FROM [dogs];" ,
45
45
"DROP TABLE [dogs];" ,
46
46
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
47
47
],
51
51
{"types" : {"age" : int }, "rename" : {"age" : "dog_age" }},
52
52
[
53
53
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [dog_age] INTEGER\n );" ,
54
- "INSERT INTO [dogs_new_suffix] ([id], [name], [dog_age])\n SELECT [id], [name], [age] FROM [dogs];" ,
54
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [dog_age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
55
55
"DROP TABLE [dogs];" ,
56
56
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
57
57
],
61
61
{"pk" : "age" },
62
62
[
63
63
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER,\n [name] TEXT,\n [age] TEXT PRIMARY KEY\n );" ,
64
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
64
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
65
65
"DROP TABLE [dogs];" ,
66
66
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
67
67
],
71
71
{"pk" : ("age" , "name" )},
72
72
[
73
73
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER,\n [name] TEXT,\n [age] TEXT,\n PRIMARY KEY ([age], [name])\n );" ,
74
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
74
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
75
75
"DROP TABLE [dogs];" ,
76
76
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
77
77
],
81
81
{"pk" : None },
82
82
[
83
83
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER,\n [name] TEXT,\n [age] TEXT\n );" ,
84
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
84
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
85
85
"DROP TABLE [dogs];" ,
86
86
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
87
87
],
91
91
{"drop" : ["age" ], "keep_table" : "kept_table" },
92
92
[
93
93
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT\n );" ,
94
- "INSERT INTO [dogs_new_suffix] ([id], [name])\n SELECT [id], [name] FROM [dogs];" ,
94
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name])\n SELECT [rowid], [id], [name] FROM [dogs];" ,
95
95
"ALTER TABLE [dogs] RENAME TO [kept_table];" ,
96
96
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
97
97
],
@@ -134,7 +134,7 @@ def tracer(sql, params):
134
134
{},
135
135
[
136
136
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER,\n [name] TEXT,\n [age] TEXT\n );" ,
137
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
137
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
138
138
"DROP TABLE [dogs];" ,
139
139
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
140
140
],
@@ -144,7 +144,7 @@ def tracer(sql, params):
144
144
{"types" : {"age" : int }},
145
145
[
146
146
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER,\n [name] TEXT,\n [age] INTEGER\n );" ,
147
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
147
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
148
148
"DROP TABLE [dogs];" ,
149
149
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
150
150
],
@@ -154,7 +154,7 @@ def tracer(sql, params):
154
154
{"rename" : {"age" : "dog_age" }},
155
155
[
156
156
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER,\n [name] TEXT,\n [dog_age] TEXT\n );" ,
157
- "INSERT INTO [dogs_new_suffix] ([id], [name], [dog_age])\n SELECT [id], [name], [age] FROM [dogs];" ,
157
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [dog_age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
158
158
"DROP TABLE [dogs];" ,
159
159
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
160
160
],
@@ -164,7 +164,7 @@ def tracer(sql, params):
164
164
{"pk" : "id" },
165
165
[
166
166
"CREATE TABLE [dogs_new_suffix] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [age] TEXT\n );" ,
167
- "INSERT INTO [dogs_new_suffix] ([id], [name], [age])\n SELECT [id], [name], [age] FROM [dogs];" ,
167
+ "INSERT INTO [dogs_new_suffix] ([rowid], [ id], [name], [age])\n SELECT [rowid], [id], [name], [age] FROM [dogs];" ,
168
168
"DROP TABLE [dogs];" ,
169
169
"ALTER TABLE [dogs_new_suffix] RENAME TO [dogs];" ,
170
170
],
@@ -498,3 +498,35 @@ def test_transform_replace_foreign_keys(fresh_db, foreign_keys):
498
498
" [city] INTEGER\n "
499
499
")"
500
500
)
501
+
502
+
503
+ @pytest .mark .parametrize ("table_type" , ("id_pk" , "rowid" , "compound_pk" ))
504
+ def test_transform_preserves_rowids (fresh_db , table_type ):
505
+ pk = None
506
+ if table_type == "id_pk" :
507
+ pk = "id"
508
+ elif table_type == "compound_pk" :
509
+ pk = ("id" , "name" )
510
+ elif table_type == "rowid" :
511
+ pk = None
512
+ fresh_db ["places" ].insert_all (
513
+ [
514
+ {"id" : "1" , "name" : "Paris" , "country" : "France" },
515
+ {"id" : "2" , "name" : "London" , "country" : "UK" },
516
+ {"id" : "3" , "name" : "New York" , "country" : "USA" },
517
+ ],
518
+ pk = pk ,
519
+ )
520
+ # Now delete and insert a row to mix up the `rowid` sequence
521
+ fresh_db ["places" ].delete_where ("id = ?" , ["2" ])
522
+ fresh_db ["places" ].insert ({"id" : "4" , "name" : "London" , "country" : "UK" })
523
+ previous_rows = list (
524
+ tuple (row ) for row in fresh_db .execute ("select rowid, id, name from places" )
525
+ )
526
+ # Transform it
527
+ fresh_db ["places" ].transform (column_order = ("country" , "name" ))
528
+ # Should be the same
529
+ next_rows = list (
530
+ tuple (row ) for row in fresh_db .execute ("select rowid, id, name from places" )
531
+ )
532
+ assert previous_rows == next_rows
0 commit comments