teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

登録時のidについて

2021/08/30 09:10

投稿

FiroProchainezo
FiroProchainezo

スコア2443

answer CHANGED
@@ -38,4 +38,36 @@
38
38
  このテーブルはcreate_all()で作成したものなので同じ物だと思いますが、idにNULLが入る要素が無いと思いますので、データ入力に失敗していたりしないか確認ください。
39
39
 
40
40
  なお、私の環境はWindows 10 + PyCharm Professional + Python 3.8です。
41
- 環境が異なる場合、動作が異なる可能性があります。
41
+ 環境が異なる場合、動作が異なる可能性があります。
42
+
43
+ ## 2021/08/30 18:00追記
44
+
45
+ 以下を設定すると発行されたクエリを見ることができます。
46
+ ```
47
+ app.config['SQLALCHEMY_ECHO'] = True
48
+ ```
49
+
50
+ 実際のクエリを確認すると以下の通りです。
51
+ ```
52
+ 2021-08-30 17:16:14,864 INFO sqlalchemy.engine.Engine BEGIN (implicit)
53
+ 2021-08-30 17:16:14,865 INFO sqlalchemy.engine.Engine INSERT INTO post (title, detail, due) VALUES (?, ?, ?)
54
+ 2021-08-30 17:16:14,865 INFO sqlalchemy.engine.Engine [generated in 0.00034s] ('hhh', 'hhh', '2021-08-04')
55
+ 2021-08-30 17:16:14,867 INFO sqlalchemy.engine.Engine COMMIT
56
+ 2021-08-30 17:16:14,878 INFO sqlalchemy.engine.Engine BEGIN (implicit)
57
+ 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
58
+ FROM post
59
+ 2021-08-30 17:16:14,879 INFO sqlalchemy.engine.Engine [cached since 12.17s ago] ()
60
+ 2021-08-30 17:16:14,880 INFO sqlalchemy.engine.Engine ROLLBACK
61
+ ```
62
+
63
+ ```
64
+ INSERT INTO post (title, detail, due) VALUES (?, ?, ?)
65
+ ```
66
+ この部分ですが、idが指定されていないINSERTが発行されている事がわかります。
67
+
68
+ sqliteでINTEGER Primary Keyのカラムに対して値を指定しないでINSERTを行った場合、自動的にrowidが使われるようです。
69
+ テーブルの中身が無い場合のrowidがいくつかが明確に書かれているドキュメントを見つけることができませんでしたが、全てのデータを消したテーブルにINSERTしてみると1が設定されたので1から始まるものと考えられます。
70
+ 値がある場合は最小のrowid + 1が設定されるようです。
71
+
72
+ `/create`で値を登録する場合、上記クエリが発行されるので、idにNULLが入る事はなく、1から順番に並んだ値が入る事が分かります。
73
+ sqliteの場合primary Key設定をしていても、NULLが入れられるという記事があったので(おかしい気がしますが)、`/create`を使わず別のツールを使う等の方法で登録すればNULLが入ったデータを設定することが可能です。