質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

4723閲覧

sqlite3.OperationalError: database is lockedの解決方法

dyrobin

総合スコア13

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/06/15 13:05

ラズパイに接続したタクトスイッチを押すと、その履歴をsqliteに保存しつつ、押された回数をカウントして、
htmlでwebブラウザに値を返すようなプログラムを考えております。
下記サイトを参考にしております。
https://reerishun.com/makerblog/?p=653

下記コードを考えました。

python

1# table writer 2 3def table_wrt(): 4 5 def _count(hoge): 6 if GPIO.input(17): 7 global count 8 count += 1 9 print(str(count) + "回目") 10 time.sleep(0.2) 11 12 @app.route("/") 13 def index(): 14 print(str(os.getpid()) + ": index(): count=" + str(count)) 15 return render_template("index1.html", testcount = count) 16 17 GPIO.add_event_detect(17, GPIO.BOTH, callback=_count, bouncetime=1000) 18 time.sleep(0.2) 19 20 # connect DB 21 conn = sqlite3.connect('pushswitch.db') 22 c = conn.cursor() 23 24 # count variable 25 i = 0 26 27 28 # create table 29 c.execute('select count(*) from sqlite_master where type="table" and name="data"') 30 if c.fetchone() == (0,): 31 c.execute('create table data(time text)') 32 33 34 try: 35 while True: 36 if GPIO.input(17) == 1: 37 while GPIO.input(17) == 1: 38 continue 39 # get date and time 40 dt_now = datetime.datetime.now() 41 42 sql = 'insert into data values (?)' 43 params = (dt_now.strftime('%Y/%m/%d %H:%M:%S'),) 44 45 46 # insert table 47 c.execute(sql, params) 48 i += 1 49 print("pushed:", i, "time") 50 51 52 except KeyboardInterrupt: 53 # data commit 54 conn.commit() 55 56 # fin 57 conn.close() 58 GPIO.cleanup() 59 sys.exit(0) 60 61 # data commit 62 conn.commit() 63 64 # fin 65 conn.close() 66 GPIO.cleanup() 67 68app.run("0.0.0.0", debug=True)

下記のエラーログが出力されます。
sqlite3.OperationalError: database is lockedが出力されると、
〇回目のカウントができなくなるようです。
同時に、5214: index(): count=2のカウントも進まなくなります。
sqlite3.OperationalError: database is lockedが出力される前は、
webブラウザ上にカウント回数を表示することもできております。

^C1回目
1回目
('pushed:', 1, 'time')
2回目
2回目
('pushed:', 2, 'time')
Traceback (most recent call last):
File "countupcustom.py", line 159, in <module>
table_wrt()
File "countupcustom.py", line 74, in table_wrt
c.execute(sql, params)
sqlite3.OperationalError: database is locked
pi@raspberrypi:~/dev/flask/countup5 $ 5214: index(): count=2
192.168.43.57 - - [15/Jun/2021 21:50:47] "GET / HTTP/1.1" 200 -
('pushed:', 3, 'time')
('pushed:', 4, 'time')
('pushed:', 5, 'time')
5214: index(): count=2
192.168.43.57 - - [15/Jun/2021 21:51:00] "GET / HTTP/1.1" 200 -
5214: index(): count=2

また、上記コードを実行してctl+Cで強制終了したあとは、
下記エラーが出力されるので、psとkillでプロセスを終了させなければなりません。
socket.error: [Errno 98] Address already in use

解決方法やご意見など、ご教示頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このプログラムはどのように実行することを想定しているのでしょうか?
ラズパイのスイッチを押されたらカウントアップする処理と、Web処理が同じ関数に入っているのが理解できません。
WebはWeb、スイッチのカウントアップはカウントアップで別にし、dbで連携するように変えた方が良いと思います。

また、sqliteの処理ですが、sqliteは所詮ファイルなので適切に閉じてあげる必要があるはずです。

connectしたら必ずcloseする、書き込みのexecuteに対しては適切にcommitを入れるとした上で、エラー処理を正しく行った方が良いです。
(except にcommitが入っている理由がわかりません。エラーなのですから、rollbackするものでは?)
また、一番下にある以下ですが、これは実行されないのでは?

# data commit conn.commit() # fin conn.close() GPIO.cleanup()

投稿2021/06/21 04:17

FiroProchainezo

総合スコア2421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dyrobin

2021/06/21 08:00

ご回答ありがとうございます。 スイッチをカウントアップしてDBに保存⇒DBから取り出してwebに反映する 上記を違う関数で実装してみたいと思います。 sqliteの使い方につきましても、ありがとうございます。 勉強し直して、コードを考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問