回答編集履歴

1

登録時のidについて

2021/08/30 09:10

投稿

FiroProchainezo
FiroProchainezo

スコア2401

test CHANGED
@@ -79,3 +79,67 @@
79
79
  なお、私の環境はWindows 10 + PyCharm Professional + Python 3.8です。
80
80
 
81
81
  環境が異なる場合、動作が異なる可能性があります。
82
+
83
+
84
+
85
+ ## 2021/08/30 18:00追記
86
+
87
+
88
+
89
+ 以下を設定すると発行されたクエリを見ることができます。
90
+
91
+ ```
92
+
93
+ app.config['SQLALCHEMY_ECHO'] = True
94
+
95
+ ```
96
+
97
+
98
+
99
+ 実際のクエリを確認すると以下の通りです。
100
+
101
+ ```
102
+
103
+ 2021-08-30 17:16:14,864 INFO sqlalchemy.engine.Engine BEGIN (implicit)
104
+
105
+ 2021-08-30 17:16:14,865 INFO sqlalchemy.engine.Engine INSERT INTO post (title, detail, due) VALUES (?, ?, ?)
106
+
107
+ 2021-08-30 17:16:14,865 INFO sqlalchemy.engine.Engine [generated in 0.00034s] ('hhh', 'hhh', '2021-08-04')
108
+
109
+ 2021-08-30 17:16:14,867 INFO sqlalchemy.engine.Engine COMMIT
110
+
111
+ 2021-08-30 17:16:14,878 INFO sqlalchemy.engine.Engine BEGIN (implicit)
112
+
113
+ 2021-08-30 17:16:14,879 INFO sqlalchemy.engine.Engine SELECT post.id AS post_id, post.title AS post_title, post.detail AS post_detail, post.due AS post_due
114
+
115
+ FROM post
116
+
117
+ 2021-08-30 17:16:14,879 INFO sqlalchemy.engine.Engine [cached since 12.17s ago] ()
118
+
119
+ 2021-08-30 17:16:14,880 INFO sqlalchemy.engine.Engine ROLLBACK
120
+
121
+ ```
122
+
123
+
124
+
125
+ ```
126
+
127
+ INSERT INTO post (title, detail, due) VALUES (?, ?, ?)
128
+
129
+ ```
130
+
131
+ この部分ですが、idが指定されていないINSERTが発行されている事がわかります。
132
+
133
+
134
+
135
+ sqliteでINTEGER Primary Keyのカラムに対して値を指定しないでINSERTを行った場合、自動的にrowidが使われるようです。
136
+
137
+ テーブルの中身が無い場合のrowidがいくつかが明確に書かれているドキュメントを見つけることができませんでしたが、全てのデータを消したテーブルにINSERTしてみると1が設定されたので1から始まるものと考えられます。
138
+
139
+ 値がある場合は最小のrowid + 1が設定されるようです。
140
+
141
+
142
+
143
+ `/create`で値を登録する場合、上記クエリが発行されるので、idにNULLが入る事はなく、1から順番に並んだ値が入る事が分かります。
144
+
145
+ sqliteの場合primary Key設定をしていても、NULLが入れられるという記事があったので(おかしい気がしますが)、`/create`を使わず別のツールを使う等の方法で登録すればNULLが入ったデータを設定することが可能です。