質問編集履歴

4

ご回答を受けての追記

2019/10/25 03:42

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -436,6 +436,100 @@
436
436
 
437
437
  ```
438
438
 
439
+
440
+
441
+ ###ご回答を受けての追記
442
+
443
+
444
+
445
+ 不明瞭な点があったため明白にします。
446
+
447
+
448
+
449
+ * 実現したいこと
450
+
451
+ 検索フォームに入力されたら、大文字小文字問わず部分一致で該当するcityを持つデータのnameを取得し、画面遷移で(POSTして)表示を変えたいです。
452
+
453
+
454
+
455
+ Tokyoの場合、画面遷移をして
456
+
457
+ ```
458
+
459
+ Hanako
460
+
461
+ Taro
462
+
463
+ ```
464
+
465
+ です。
466
+
467
+
468
+
469
+
470
+
471
+ * search_venuesの戻り値がrender_template
472
+
473
+ に関して、javascriptとpythonのjinja2で表示処理のちがいがよくわかっていないのですが
474
+
475
+ 検索しても該当するページを見つけられていない状況です。
476
+
477
+
478
+
479
+ def create_todo():に倣って以下のように変更しましたが依然として、
480
+
481
+
482
+
483
+ 1. 部分一致検索が機能しているのか
484
+
485
+ 2. javascriptとpythonのjinja2のちがいによる表示処理
486
+
487
+
488
+
489
+ がうまく理解できていないので、最新版のコードでもエラーが出ています。
490
+
491
+
492
+
493
+ ```python
494
+
495
+
496
+
497
+ @app.route('/todos/search', methods=['GET'])
498
+
499
+ def search_venues():
500
+
501
+ #HTMLのフォームから検索に用いられた単語を取得
502
+
503
+ search_term = db.session.query(Todo).get(request.form["search_term"].strip())
504
+
505
+ #search_term = request.form.get('search_term');
506
+
507
+ results = []
508
+
509
+
510
+
511
+ if search_term == "":
512
+
513
+ print("enter a keyword")
514
+
515
+
516
+
517
+ users = session.query(Todo).filter(Todo.city.like('%'+ search_term + '%')).all()
518
+
519
+ for user in users:
520
+
521
+ print(user)
522
+
523
+ results.append(user)
524
+
525
+
526
+
527
+ return jsonify(results)
528
+
529
+ ```
530
+
531
+
532
+
439
533
  ### 補足情報(FW/ツールのバージョンなど)
440
534
 
441
535
  Python 3.6.0

3

コードを最新版に修正

2019/10/25 03:42

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -100,153 +100,151 @@
100
100
 
101
101
  ```python
102
102
 
103
- from flask import Flask, render_template, request, redirect, url_for, abort, jsonify
104
-
105
- from flask_sqlalchemy import SQLAlchemy
106
-
107
- import sys
108
-
109
-
110
-
111
- app = Flask(__name__)
112
-
113
- app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://username@localhost:5432/simplewr'
114
-
115
- db = SQLAlchemy(app)
116
-
117
-
118
-
119
- class Todo(db.Model):
120
-
121
- __tablename__ = 'todos'
122
-
123
-
124
-
125
- id = db.Column(db.Integer, primary_key=True)
126
-
127
- name = db.Column(db.String)
128
-
129
- city = db.Column(db.String(120))
130
-
131
-
132
-
133
- # TODO: implement any missing fields, as a database migration using Flask-Migrate
134
-
135
- def __repr__(self):
136
-
137
- return f'<Todo {self.id} {self.name} {self.city}>'
138
-
139
-
140
-
141
- db.create_all()
142
-
143
-
144
-
145
- @app.route('/todos/create', methods=['POST'])
146
-
147
- def create_todo():
148
-
149
- error = False
150
-
151
- body = {}
152
-
153
-
154
-
155
- try:
156
-
157
- name = request.form['name']
158
-
159
- city = request.form['city']
160
-
161
- todo = Todo(name=name, city=city)
162
-
163
- db.session.add(todo)
164
-
165
- db.session.commit()
166
-
167
- body['name'] = todo.name
168
-
169
- body['city'] = todo.city
170
-
171
- except:
172
-
173
- error = True
174
-
175
- db.session.rollback()
176
-
177
- print(sys.exc_info())
178
-
179
- finally:
180
-
181
- db.session.close()
182
-
183
- if error:
184
-
185
- abort (400)
186
-
187
- else:
188
-
189
- return jsonify(body)
190
-
191
-
192
-
193
- @app.route('/todos/search', methods=['POST'])
194
-
195
- def search_venues():
196
-
197
- #HTMLのフォームから検索に用いられた単語を取得
198
-
199
- search_term = request.form.get('search_term');
200
-
201
- results = []
202
-
203
- # 部分一致 LIKE
204
-
205
- # WHERE LIKE '%...%'
206
-
207
- if search_term == "":
208
-
209
- print("enter a keyword")
210
-
211
-
212
-
213
- for student in session.query(Todo).filter(todo.city.like('%search_term%')):
214
-
215
- print(todo.name)
216
-
217
- results.append(todo.name)
218
-
219
-
220
-
221
- """
222
-
223
- Tokyoで検索された時
224
-
225
- Todo.cityがTokyo and Yokohamaでも、Tokyoでも部分一致で該当するデータのnameを出力
226
-
227
-
228
-
229
- Hanako
230
-
231
- Taro
232
-
233
- みたいな感じで出力
234
-
235
-
236
-
237
- """
238
-
239
- return render_template('index.html', results=results, search_term=search_term)
240
-
241
- #htmlのrenderにはjinja2というものが使われており、中でPythonのコードを実行することができる
242
-
243
-
244
-
245
- @app.route('/')
246
-
247
- def index():
248
-
249
- return render_template('index.html', data=Todo.query.all())
103
+ from flask import Flask, render_template, request, redirect, url_for, abort, jsonify
104
+
105
+ from flask_sqlalchemy import SQLAlchemy
106
+
107
+ import sys
108
+
109
+
110
+
111
+ app = Flask(__name__)
112
+
113
+ app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://username@localhost:5432/simplewr'
114
+
115
+ db = SQLAlchemy(app)
116
+
117
+
118
+
119
+ class Todo(db.Model):
120
+
121
+ __tablename__ = 'todos'
122
+
123
+
124
+
125
+ id = db.Column(db.Integer, primary_key=True)
126
+
127
+ name = db.Column(db.String)
128
+
129
+ city = db.Column(db.String(120))
130
+
131
+
132
+
133
+ def __repr__(self):
134
+
135
+ return f'<Todo {self.id} {self.name} {self.city}>'
136
+
137
+
138
+
139
+ db.create_all()
140
+
141
+
142
+
143
+ @app.route('/todos/create', methods=['POST'])
144
+
145
+ def create_todo():
146
+
147
+ error = False
148
+
149
+ body = {}
150
+
151
+
152
+
153
+ try:
154
+
155
+ name = request.form['name']
156
+
157
+ city = request.form['city']
158
+
159
+ todo = Todo(name=name, city=city)
160
+
161
+ db.session.add(todo)
162
+
163
+ db.session.commit()
164
+
165
+ body['name'] = todo.name
166
+
167
+ body['city'] = todo.city
168
+
169
+ except:
170
+
171
+ error = True
172
+
173
+ db.session.rollback()
174
+
175
+ print(sys.exc_info())
176
+
177
+ finally:
178
+
179
+ db.session.close()
180
+
181
+ if error:
182
+
183
+ abort (400)
184
+
185
+ else:
186
+
187
+ return jsonify(body)
188
+
189
+
190
+
191
+ @app.route('/todos/search', methods=['POST'])
192
+
193
+ def search_venues():
194
+
195
+ #HTMLのフォームから検索に用いられた単語を取得
196
+
197
+ search_term = request.form.get('search_term');
198
+
199
+ results = []
200
+
201
+ # 部分一致 LIKE
202
+
203
+ # WHERE LIKE '%...%'
204
+
205
+ if search_term == "":
206
+
207
+ print("enter a keyword")
208
+
209
+
210
+
211
+ for student in session.query(Todo).filter(todo.city.like('%search_term%')):
212
+
213
+ print(todo.name)
214
+
215
+ results.append(todo.name)
216
+
217
+
218
+
219
+ """
220
+
221
+ Tokyoで検索された時
222
+
223
+ Todo.cityがTokyo and Yokohamaでも、Tokyoでも部分一致で該当するデータのnameを出力
224
+
225
+
226
+
227
+  出力
228
+
229
+ Hanako
230
+
231
+ Taro
232
+
233
+
234
+
235
+ """
236
+
237
+ return render_template('index.html', results=results, search_term=search_term)
238
+
239
+ #htmlのrenderにはjinja2というものが使われており、中でPythonのコードを実行することができる
240
+
241
+
242
+
243
+ @app.route('/')
244
+
245
+ def index():
246
+
247
+ return render_template('index.html', data=Todo.query.all())
250
248
 
251
249
  ```
252
250
 
@@ -262,15 +260,15 @@
262
260
 
263
261
  <head>
264
262
 
265
- <title>Todo App</title>
263
+ <title>Todo App</title>
266
264
 
267
265
  <style>
268
266
 
269
- .hidden{
267
+ .hidden{
270
-
268
+
271
- display: none;
269
+ display: none;
272
-
270
+
273
- }
271
+ }
274
272
 
275
273
  </style>
276
274
 
@@ -278,123 +276,129 @@
278
276
 
279
277
  <body>
280
278
 
281
- <form method="post" action="/todos/create">
282
-
283
- <h4>name</h4>
284
-
285
- <input type= "text" name="name" />
286
-
287
- <h4>city</h4>
288
-
289
- <input type= "text" name="city" />
290
-
291
- <input type= "submit" value="Create" />
292
-
293
- <h4>search box</h4>
294
-
295
- <input type="text" name="search_term" />
296
-
297
- </form>
298
-
299
- <div id= "error" class="hidden">Something went wrong!</div>
300
-
301
- <ul>
302
-
303
- {% for d in data %}
304
-
305
- <li>{{d.name}}</li>
306
-
307
- <li>{{d.city}}</li>
308
-
309
- <li>{{d.search_term}}</li>
310
-
311
- {% endfor %}
312
-
313
- {% for name in results %}
314
-
315
- <li>
316
-
317
- <h5>{{ todo.name }}</h5> <!-- 検索結果をページにプリント -->
318
-
319
- </li>
320
-
321
- {% endfor %}
322
-
323
- </ul>
324
-
325
- <script>
326
-
327
- const nameInput = document.getElementById('name');
328
-
329
- const cityInput = document.getElementById('city');
330
-
331
- const sechInput = document.getElementById('search_term');
332
-
333
- document.getElementById('form').onsubmit = function(e) {
334
-
335
- e.preventDefault();
336
-
337
- const name = nameInput.value;
338
-
339
- const city = cityInput.value;
340
-
341
- const search_term = sechInput.value;
342
-
343
- descInput.value = '';
344
-
345
- fetch('/todos/create', {
346
-
347
- method: 'POST',
348
-
349
- body: JSON.stringify({
350
-
351
- 'name': name,
352
-
353
- 'city': city,
354
-
355
- }),
356
-
357
- headers: {
358
-
359
- 'Content-Type': 'application/json',
360
-
361
- }
362
-
363
- })
364
-
365
- //return the serched data
366
-
367
- SQL
368
-
369
- SELECT city from table where LIKE search_term;
370
-
371
- .then(response => response.json())
372
-
373
- .then(jsonResponse => {
374
-
375
- console.log('response', jsonResponse);
376
-
377
- li = document.createElement('li');
378
-
379
- li.innerText = name;
380
-
381
- li.innerText = city;
382
-
383
- document.getElementById('todos').appendChild(li);
384
-
385
- document.getElementById('error').className = 'hidden';
386
-
387
- })
388
-
389
- .catch(function() {
390
-
391
- document.getElementById('error').className = '';
392
-
393
- })
394
-
395
- }
396
-
397
- </script>
279
+ <form method="post" action="/todos/create">
280
+
281
+ <h4>name</h4>
282
+
283
+ <input type= "text" name="name" />
284
+
285
+ <h4>city</h4>
286
+
287
+ <input type= "text" name="city" />
288
+
289
+ <input type= "submit" value="Create" />
290
+
291
+ <h4>search box</h4>
292
+
293
+ <input type="text" name="search_term" />
294
+
295
+ <input type= "submit" value="Search" />
296
+
297
+ </form>
298
+
299
+ <div id= "error" class="hidden">Something went wrong!</div>
300
+
301
+ <ul>
302
+
303
+ {% for d in data %}
304
+
305
+ <li>{{d.name}}</li>
306
+
307
+ <li>{{d.city}}</li>
308
+
309
+ <li>{{d.search_term}}</li>
310
+
311
+ {% endfor %}
312
+
313
+ {% for name in results %}
314
+
315
+ <li>
316
+
317
+ <h5>{{ todo.name }}</h5> <!-- 検索結果をページにプリント -->
318
+
319
+ </li>
320
+
321
+ {% endfor %}
322
+
323
+ </ul>
324
+
325
+ <script>
326
+
327
+ const nameInput = document.getElementById('name');
328
+
329
+ const cityInput = document.getElementById('city');
330
+
331
+ const sechInput = document.getElementById('search_term');
332
+
333
+ document.getElementById('form').onsubmit = function(e) {
334
+
335
+ e.preventDefault();
336
+
337
+ const name = nameInput.value;
338
+
339
+ const city = cityInput.value;
340
+
341
+ const search_term = sechInput.value;
342
+
343
+ descInput.value = '';
344
+
345
+ fetch('/todos/create', {
346
+
347
+ method: 'POST',
348
+
349
+ body: JSON.stringify({
350
+
351
+ 'name': name,
352
+
353
+ 'city': city,
354
+
355
+ }),
356
+
357
+ headers: {
358
+
359
+ 'Content-Type': 'application/json',
360
+
361
+ }
362
+
363
+ })
364
+
365
+
366
+
367
+ //return the serched data
368
+
369
+ SQL
370
+
371
+ SELECT city from table where LIKE search_term;
372
+
373
+
374
+
375
+ .then(response => response.json())
376
+
377
+ .then(jsonResponse => {
378
+
379
+ console.log('response', jsonResponse);
380
+
381
+ li = document.createElement('li');
382
+
383
+ li.innerText = name;
384
+
385
+ li.innerText = city;
386
+
387
+ document.getElementById('todos').appendChild(li);
388
+
389
+ document.getElementById('error').className = 'hidden';
390
+
391
+ })
392
+
393
+ .catch(function() {
394
+
395
+ document.getElementById('error').className = '';
396
+
397
+ })
398
+
399
+ }
400
+
401
+ </script>
398
402
 
399
403
  </body>
400
404
 

2

投稿が一部消えていたため

2019/10/24 09:05

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- Webアプリで検索がうまくできない
1
+ WebアプリでLIKE句を用いた検索がうまくできない
test CHANGED
@@ -1,14 +1,14 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
-
4
-
5
3
  FlaskとPostgres, SQLAlchemnyで作ったWebアプリで
6
4
 
7
5
  データの入力と検索を行い、検索は部分一致で結果を出してページに表示しようとしています。
8
6
 
9
-
7
+ SQLAlchemyのLIKE句を使った記述は以下の記事を参考にしました。
8
+
10
-
9
+ [参考記事](https://it-engineer-lab.com/archives/1183)
11
-
10
+
11
+
12
12
 
13
13
  ### 発生している問題・エラーメッセージ
14
14
 
@@ -16,7 +16,241 @@
16
16
 
17
17
  検索で結果をWebアプリで取得できない状態です。
18
18
 
19
+
20
+
19
-
21
+ エラーメッセージは出ていないので、以下の状況を
22
+
23
+ Postgresデータベース内でLIKE句を使ってSELECTで求めた結果と同じ出力にするにはどうすればいいでしょうか。
24
+
25
+
26
+
27
+ htmlファイルの
28
+
29
+ ```
30
+
31
+ {% for name in results %}
32
+
33
+ <li>
34
+
35
+ <h5>{{ todo.name }}</h5> <!-- 検索結果をページにプリント -->
36
+
37
+ </li>
38
+
39
+ {% endfor %}
40
+
41
+ ```
42
+
43
+ が機能しておらず、`Search`をクリックすると以下が表示されます。
44
+
45
+ ```
46
+
47
+ {
48
+
49
+ "city": "",
50
+
51
+ "name": ""
52
+
53
+ }
54
+
55
+ ```
56
+
57
+
58
+
59
+ ### 該当のソースコード
60
+
61
+
62
+
63
+ Postgres データベース内
64
+
65
+ ```
66
+
67
+ # \dt
68
+
69
+ List of relations
70
+
71
+ Schema | Name | Type | Owner
72
+
73
+ --------+-------+-------+-------
74
+
75
+ public | todos | table | username
76
+
77
+
78
+
79
+ # select * from todos;
80
+
81
+ id | name | city
82
+
83
+ ----+--------+-------
84
+
85
+ 1 | Hina | Tokyo
86
+
87
+ 2 | Shun | Tokyo
88
+
89
+ 3 | Taro | Fukuoka
90
+
91
+ 4 | Rika | Nagano
92
+
93
+ 5 | Hanako | Tokyo and Yokohama
94
+
95
+ 6 | Haruka | Kyoto
96
+
97
+ ```
98
+
99
+ app.py
100
+
101
+ ```python
102
+
103
+ from flask import Flask, render_template, request, redirect, url_for, abort, jsonify
104
+
105
+ from flask_sqlalchemy import SQLAlchemy
106
+
107
+ import sys
108
+
109
+
110
+
111
+ app = Flask(__name__)
112
+
113
+ app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://username@localhost:5432/simplewr'
114
+
115
+ db = SQLAlchemy(app)
116
+
117
+
118
+
119
+ class Todo(db.Model):
120
+
121
+ __tablename__ = 'todos'
122
+
123
+
124
+
125
+ id = db.Column(db.Integer, primary_key=True)
126
+
127
+ name = db.Column(db.String)
128
+
129
+ city = db.Column(db.String(120))
130
+
131
+
132
+
133
+ # TODO: implement any missing fields, as a database migration using Flask-Migrate
134
+
135
+ def __repr__(self):
136
+
137
+ return f'<Todo {self.id} {self.name} {self.city}>'
138
+
139
+
140
+
141
+ db.create_all()
142
+
143
+
144
+
145
+ @app.route('/todos/create', methods=['POST'])
146
+
147
+ def create_todo():
148
+
149
+ error = False
150
+
151
+ body = {}
152
+
153
+
154
+
155
+ try:
156
+
157
+ name = request.form['name']
158
+
159
+ city = request.form['city']
160
+
161
+ todo = Todo(name=name, city=city)
162
+
163
+ db.session.add(todo)
164
+
165
+ db.session.commit()
166
+
167
+ body['name'] = todo.name
168
+
169
+ body['city'] = todo.city
170
+
171
+ except:
172
+
173
+ error = True
174
+
175
+ db.session.rollback()
176
+
177
+ print(sys.exc_info())
178
+
179
+ finally:
180
+
181
+ db.session.close()
182
+
183
+ if error:
184
+
185
+ abort (400)
186
+
187
+ else:
188
+
189
+ return jsonify(body)
190
+
191
+
192
+
193
+ @app.route('/todos/search', methods=['POST'])
194
+
195
+ def search_venues():
196
+
197
+ #HTMLのフォームから検索に用いられた単語を取得
198
+
199
+ search_term = request.form.get('search_term');
200
+
201
+ results = []
202
+
203
+ # 部分一致 LIKE
204
+
205
+ # WHERE LIKE '%...%'
206
+
207
+ if search_term == "":
208
+
209
+ print("enter a keyword")
210
+
211
+
212
+
213
+ for student in session.query(Todo).filter(todo.city.like('%search_term%')):
214
+
215
+ print(todo.name)
216
+
217
+ results.append(todo.name)
218
+
219
+
220
+
221
+ """
222
+
223
+ Tokyoで検索された時
224
+
225
+ Todo.cityがTokyo and Yokohamaでも、Tokyoでも部分一致で該当するデータのnameを出力
226
+
227
+
228
+
229
+ Hanako
230
+
231
+ Taro
232
+
233
+ みたいな感じで出力
234
+
235
+
236
+
237
+ """
238
+
239
+ return render_template('index.html', results=results, search_term=search_term)
240
+
241
+ #htmlのrenderにはjinja2というものが使われており、中でPythonのコードを実行することができる
242
+
243
+
244
+
245
+ @app.route('/')
246
+
247
+ def index():
248
+
249
+ return render_template('index.html', data=Todo.query.all())
250
+
251
+ ```
252
+
253
+
20
254
 
21
255
  index.html
22
256
 
@@ -28,15 +262,15 @@
28
262
 
29
263
  <head>
30
264
 
31
- <title>Todo App</title>
265
+ <title>Todo App</title>
32
266
 
33
267
  <style>
34
268
 
35
- .hidden{
269
+ .hidden{
36
-
270
+
37
- display: none;
271
+ display: none;
38
-
272
+
39
- }
273
+ }
40
274
 
41
275
  </style>
42
276
 
@@ -44,127 +278,123 @@
44
278
 
45
279
  <body>
46
280
 
47
- <form method="post" action="/todos/create">
48
-
49
- <h4>name</h4>
50
-
51
- <input type= "text" name="name" />
52
-
53
- <h4>city</h4>
54
-
55
- <input type= "text" name="city" />
56
-
57
- <input type= "submit" value="Create" />
58
-
59
- <h4>search box</h4>
60
-
61
- <input type="text" name="search_term" />
62
-
63
- </form>
64
-
65
- <div id= "error" class="hidden">Something went wrong!</div>
66
-
67
- <ul>
68
-
69
- {% for d in data %}
70
-
71
- <li>{{d.name}}</li>
72
-
73
- <li>{{d.city}}</li>
74
-
75
- <li>{{d.search_term}}</li>
76
-
77
- {% endfor %}
78
-
79
- {% for name in results %}
80
-
81
- <li>
82
-
83
- <h5>{{ todo.name }}</h5> <!-- 検索結果をページにプリント -->
84
-
85
- </li>
86
-
87
- {% endfor %}
88
-
89
- </ul>
90
-
91
- <script>
92
-
93
- const nameInput = document.getElementById('name');
94
-
95
- const cityInput = document.getElementById('city');
96
-
97
- const sechInput = document.getElementById('search_term');
98
-
99
- document.getElementById('form').onsubmit = function(e) {
100
-
101
- e.preventDefault();
102
-
103
- const name = nameInput.value;
104
-
105
- const city = cityInput.value;
106
-
107
- const search_term = sechInput.value;
108
-
109
- descInput.value = '';
110
-
111
- fetch('/todos/create', {
112
-
113
- method: 'POST',
114
-
115
- body: JSON.stringify({
116
-
117
- 'name': name,
118
-
119
- 'city': city,
120
-
121
- }),
122
-
123
- headers: {
124
-
125
- 'Content-Type': 'application/json',
126
-
127
- }
128
-
129
- })
130
-
131
-
132
-
133
- //return the serched data
134
-
135
- SQL
136
-
137
- SELECT city from table where LIKE search_term;
138
-
139
-
140
-
141
- .then(response => response.json())
142
-
143
- .then(jsonResponse => {
144
-
145
- console.log('response', jsonResponse);
146
-
147
- li = document.createElement('li');
148
-
149
- li.innerText = name;
150
-
151
- li.innerText = city;
152
-
153
- document.getElementById('todos').appendChild(li);
154
-
155
- document.getElementById('error').className = 'hidden';
156
-
157
- })
158
-
159
- .catch(function() {
160
-
161
- document.getElementById('error').className = '';
162
-
163
- })
164
-
165
- }
166
-
167
- </script>
281
+ <form method="post" action="/todos/create">
282
+
283
+ <h4>name</h4>
284
+
285
+ <input type= "text" name="name" />
286
+
287
+ <h4>city</h4>
288
+
289
+ <input type= "text" name="city" />
290
+
291
+ <input type= "submit" value="Create" />
292
+
293
+ <h4>search box</h4>
294
+
295
+ <input type="text" name="search_term" />
296
+
297
+ </form>
298
+
299
+ <div id= "error" class="hidden">Something went wrong!</div>
300
+
301
+ <ul>
302
+
303
+ {% for d in data %}
304
+
305
+ <li>{{d.name}}</li>
306
+
307
+ <li>{{d.city}}</li>
308
+
309
+ <li>{{d.search_term}}</li>
310
+
311
+ {% endfor %}
312
+
313
+ {% for name in results %}
314
+
315
+ <li>
316
+
317
+ <h5>{{ todo.name }}</h5> <!-- 検索結果をページにプリント -->
318
+
319
+ </li>
320
+
321
+ {% endfor %}
322
+
323
+ </ul>
324
+
325
+ <script>
326
+
327
+ const nameInput = document.getElementById('name');
328
+
329
+ const cityInput = document.getElementById('city');
330
+
331
+ const sechInput = document.getElementById('search_term');
332
+
333
+ document.getElementById('form').onsubmit = function(e) {
334
+
335
+ e.preventDefault();
336
+
337
+ const name = nameInput.value;
338
+
339
+ const city = cityInput.value;
340
+
341
+ const search_term = sechInput.value;
342
+
343
+ descInput.value = '';
344
+
345
+ fetch('/todos/create', {
346
+
347
+ method: 'POST',
348
+
349
+ body: JSON.stringify({
350
+
351
+ 'name': name,
352
+
353
+ 'city': city,
354
+
355
+ }),
356
+
357
+ headers: {
358
+
359
+ 'Content-Type': 'application/json',
360
+
361
+ }
362
+
363
+ })
364
+
365
+ //return the serched data
366
+
367
+ SQL
368
+
369
+ SELECT city from table where LIKE search_term;
370
+
371
+ .then(response => response.json())
372
+
373
+ .then(jsonResponse => {
374
+
375
+ console.log('response', jsonResponse);
376
+
377
+ li = document.createElement('li');
378
+
379
+ li.innerText = name;
380
+
381
+ li.innerText = city;
382
+
383
+ document.getElementById('todos').appendChild(li);
384
+
385
+ document.getElementById('error').className = 'hidden';
386
+
387
+ })
388
+
389
+ .catch(function() {
390
+
391
+ document.getElementById('error').className = '';
392
+
393
+ })
394
+
395
+ }
396
+
397
+ </script>
168
398
 
169
399
  </body>
170
400
 
@@ -181,3 +411,35 @@
181
411
  ```
182
412
 
183
413
  で実行します。
414
+
415
+ ### 試したこと
416
+
417
+ SQL文で取得できることは確認しました。
418
+
419
+ ```
420
+
421
+ # select name from todos where city LIKE 'Tokyo';
422
+
423
+ name
424
+
425
+ -------
426
+
427
+ Hina
428
+
429
+ Shun
430
+
431
+ Hanako
432
+
433
+ ```
434
+
435
+ ### 補足情報(FW/ツールのバージョンなど)
436
+
437
+ Python 3.6.0
438
+
439
+ Flask 1.1.1
440
+
441
+ Sqlalchemy 1.3.10
442
+
443
+ psql (PostgreSQL) 11.5
444
+
445
+ ブラウザ Google Chrome

1

誤字

2019/10/24 04:34

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- Webアプリで検索された単語からLIKE句を使って出力を求める時にうまく求められない
1
+ Webアプリで検索うまくできない
test CHANGED
@@ -10,253 +10,11 @@
10
10
 
11
11
 
12
12
 
13
- SQLAlchemyのLIKE句を使った記述は以下の記事を参考にしました。
14
-
15
- [参考記事](https://it-engineer-lab.com/archives/1183)
16
-
17
-
18
-
19
13
  ### 発生している問題・エラーメッセージ
20
14
 
21
15
  データの入力はフォームに入力したものがデータベースに正しく格納されていますが、
22
16
 
23
17
  検索で結果をWebアプリで取得できない状態です。
24
-
25
-
26
-
27
- エラーメッセージは出ていないので、以下の状況を
28
-
29
- Postgresデータベース内でLIKE句を使ってSELECTで求めた結果と同じ出力にするにはどうすればいいでしょうか。
30
-
31
-
32
-
33
- htmlファイルの
34
-
35
- ```
36
-
37
- {% for name in results %}
38
-
39
- <li>
40
-
41
- <h5>{{ todo.name }}</h5> <!-- 検索結果をページにプリント -->
42
-
43
- </li>
44
-
45
- {% endfor %}
46
-
47
- ```
48
-
49
- が機能しておらず、`Search`をクリックすると以下が表示されます。
50
-
51
- ```
52
-
53
- {
54
-
55
- "city": "",
56
-
57
- "name": ""
58
-
59
- }
60
-
61
- ```
62
-
63
-
64
-
65
- ### 該当のソースコード
66
-
67
-
68
-
69
- Postgres データベース内
70
-
71
- ```
72
-
73
- # \dt
74
-
75
- List of relations
76
-
77
- Schema | Name | Type | Owner
78
-
79
- --------+-------+-------+-------
80
-
81
- public | todos | table | username
82
-
83
-
84
-
85
- # select * from todos;
86
-
87
- id | name | city
88
-
89
- ----+--------+-------
90
-
91
- 1 | Hina | Tokyo
92
-
93
- 2 | Shun | Tokyo
94
-
95
- 3 | Taro | Fukuoka
96
-
97
- 4 | Rika | Nagano
98
-
99
- 5 | Hanako | Tokyo and Yokohama
100
-
101
- 6 | Haruka | Kyoto
102
-
103
- ```
104
-
105
- app.py
106
-
107
- ```python
108
-
109
- from flask import Flask, render_template, request, redirect, url_for, abort, jsonify
110
-
111
- from flask_sqlalchemy import SQLAlchemy
112
-
113
- import sys
114
-
115
-
116
-
117
- app = Flask(__name__)
118
-
119
- app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://username@localhost:5432/simplewr'
120
-
121
- db = SQLAlchemy(app)
122
-
123
-
124
-
125
- class Todo(db.Model):
126
-
127
- __tablename__ = 'todos'
128
-
129
-
130
-
131
- id = db.Column(db.Integer, primary_key=True)
132
-
133
- name = db.Column(db.String)
134
-
135
- city = db.Column(db.String(120))
136
-
137
-
138
-
139
- # TODO: implement any missing fields, as a database migration using Flask-Migrate
140
-
141
- def __repr__(self):
142
-
143
- return f'<Todo {self.id} {self.name} {self.city}>'
144
-
145
-
146
-
147
- db.create_all()
148
-
149
-
150
-
151
- @app.route('/todos/create', methods=['POST'])
152
-
153
- def create_todo():
154
-
155
- error = False
156
-
157
- body = {}
158
-
159
-
160
-
161
- try:
162
-
163
- name = request.form['name']
164
-
165
- city = request.form['city']
166
-
167
- todo = Todo(name=name, city=city)
168
-
169
- db.session.add(todo)
170
-
171
- db.session.commit()
172
-
173
- body['name'] = todo.name
174
-
175
- body['city'] = todo.city
176
-
177
- except:
178
-
179
- error = True
180
-
181
- db.session.rollback()
182
-
183
- print(sys.exc_info())
184
-
185
- finally:
186
-
187
- db.session.close()
188
-
189
- if error:
190
-
191
- abort (400)
192
-
193
- else:
194
-
195
- return jsonify(body)
196
-
197
-
198
-
199
- @app.route('/todos/search', methods=['POST'])
200
-
201
- def search_venues():
202
-
203
- #HTMLのフォームから検索に用いられた単語を取得
204
-
205
- search_term = request.form.get('search_term');
206
-
207
- results = []
208
-
209
- # 部分一致 LIKE
210
-
211
- # WHERE LIKE '%...%'
212
-
213
- if search_term == "":
214
-
215
- print("enter a keyword")
216
-
217
-
218
-
219
- for student in session.query(Todo).filter(todo.city.like('%search_term%')):
220
-
221
- print(todo.name)
222
-
223
- results.append(todo.name)
224
-
225
-
226
-
227
- """
228
-
229
- Tokyoで検索された時
230
-
231
- Todo.cityがTokyo and Yokohamaでも、Tokyoでも部分一致で該当するデータのnameを出力
232
-
233
-
234
-
235
- Hanako
236
-
237
- Taro
238
-
239
- みたいな感じで出力
240
-
241
-
242
-
243
- """
244
-
245
- return render_template('index.html', results=results, search_term=search_term)
246
-
247
- #htmlのrenderにはjinja2というものが使われており、中でPythonのコードを実行することができる
248
-
249
-
250
-
251
- @app.route('/')
252
-
253
- def index():
254
-
255
- return render_template('index.html', data=Todo.query.all())
256
-
257
- ```
258
-
259
-
260
18
 
261
19
 
262
20
 
@@ -423,47 +181,3 @@
423
181
  ```
424
182
 
425
183
  で実行します。
426
-
427
-
428
-
429
- ### 試したこと
430
-
431
-
432
-
433
- SQL文で取得できることは確認しました。
434
-
435
-
436
-
437
- ```
438
-
439
- # select name from todos where city LIKE 'Tokyo';
440
-
441
- name
442
-
443
- -------
444
-
445
- Hina
446
-
447
- Shun
448
-
449
- Hanako
450
-
451
- ```
452
-
453
-
454
-
455
-
456
-
457
- ### 補足情報(FW/ツールのバージョンなど)
458
-
459
-
460
-
461
- Python 3.6.0
462
-
463
- Flask 1.1.1
464
-
465
- Sqlalchemy 1.3.10
466
-
467
- psql (PostgreSQL) 11.5
468
-
469
- ブラウザ Google Chrome