回答編集履歴
2
sqliteのバージョンについて追記
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 を使う
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
|
> 試したこと①
|