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

回答編集履歴

2

sqliteのバージョンについて追記

2021/04/04 06:23

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,10 +1,8 @@
1
1
  > sqlite3.OperationalError: no such function: SUBSTRING
2
2
 
3
-
4
3
  Pythonのバージョン、もしくは組み込みのsqlite3のバージョンを確認して見て下さい。
5
4
  コード自体は新しいバージョンでは動くはずです。
6
5
 
7
-
8
6
  - 文字列連結でクエリーを生成するのはお勧めしません。
9
7
   エスケープが必要になるので、安全の為にはプレースホルダー(placeholder) を使います。
10
8
  - SQL の LIKE 句の使い方。パターンマッチの文字が含まれていません。
@@ -16,22 +14,12 @@
16
14
  - 追記: SUBSTR を使う
17
15
  "substring()" is an alias for "substr()" beginning with SQLite version 3.34.
18
16
 
17
+ python3.7/sqlite 3.21 substring は失敗。substr は使えました。
19
- ----
18
+ python3.8/sqlite 3.34 でsubstring の動作を確認。
20
- > たこと①
19
+ パッチバージョンによってもバージョンが変わるかもれません。
21
20
 
21
+ ```python
22
+ # sqliteのバージョンの確認方法
23
+ import sqlite3
24
+ print(sqlite3.sqlite_version_info)
22
- ```
25
+ ```
23
- cur.execute(
24
- "SELECT item_id, store_name, item_name FROM items s WHERE LEFT(s.item_name, 6) like 'パンナコッタ'")
25
- ```
26
-
27
- sqlite3 では LEFT をサポートしてません。SUBSTRING を使います。
28
-
29
-
30
- > 試したこと②
31
- ```
32
- cur.execute(
33
- "'SELECT item_id, store_name, item_name FROM items s WHERE LEFT' + '(' + 's.item_name, 6' + ')' + 'like "パンナコッタ"' ")
34
- ```
35
-
36
- 発行されるクエリは (1) と実質同じです。
37
- `s.item_name` は SQL のカラム名なので、分割する必要はありません。

1

追記: SUBSTR を使う

2021/04/04 06:22

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -13,6 +13,8 @@
13
13
  旧バージョンに対応する解決策:
14
14
  - LIKE句のパターンマッチを使う。
15
15
  `WHERE s.item_name LIKE 'パンナコッタ%'`
16
+ - 追記: SUBSTR を使う
17
+ "substring()" is an alias for "substr()" beginning with SQLite version 3.34.
16
18
 
17
19
  ----
18
20
  > 試したこと①