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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

9991閲覧

PythonでのSQLiteのClosing処理について

milkteas

総合スコア79

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/08/08 01:21

前提・実現したいこと

Python3でSQLiteでのデータ読み書きの処理を作っています。
Pythonは初めてで、勉強中しながらやっているのですが、
コネクションのクローズ処理の適切な記述方法がわかりませんでした。

発生している問題・エラーメッセージ

with closingでクローズする実装方法

Python

1with closing(sqlite3.connect(dbname)) as con: 2 cur = con.cursor() 3 sql= 'select * from users' 4 cur.execute(sql)

try ~ except ~ finallyでクローズする方法

Python

1try: 2 con = sqlite3.connect(dbname) 3 cur = con.cursor() 4 sql = 'select * from users' 5       cur.execute(sql) 6 except sqlite3.Error as e: 7 logger.exception(e) 8 except Exception as e: 9 logger.exception(e) 10 finally: 11 if con: 12 con.close() 13

どちらの処理のほうがClose処理として良いか、
また気になる点や注意点などもあれば教えて頂きたいです。

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

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

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

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

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

tachikoma

2018/08/08 01:55

con.commit()はいずこに・・・。
milkteas

2018/08/08 02:08

ご指摘ありがとうございます。executeの後です。後ほど記載修正します。。
guest

回答1

0

ベストアンサー

別案です。(未テストコードです。)
あと個人的にはExceptionはこのレベルではキャッチしないです。

Python

1try: 2 with closing(sqlite3.connect(dbname)) as con: 3 cur = con.cursor() 4 sql= 'select * from users' 5 cur.execute(sql) 6except sqlite3.Error as e: 7 logger.exception(e)

また気になる点

1, SQLインジェクション防止のために、バインドパラメータを使ってくださいな。
◇参考情報
12.6. sqlite3
2, Pythonで同じ現象が起こるかは未確認ですが、SQLiteは暗黙のトランザクションがものすごーく遅いので、明示的にトランザクションを開始してください。
sqlite メモ
3, SELECT文はORDER BY句を指定しないとSELECT結果の順序性は保証されません。

最後にアプリケーションの規模と要件によると思うのですが、
ある程度の規模なら直接SQLを書かずにORマッパーを使ったほうが良いと思います。
お試しレベルでしか使ったことはないですが、SQLAlchemyが有名だと思います。

投稿2018/08/08 03:27

umyu

総合スコア5846

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

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

milkteas

2018/08/08 03:41

丁寧なご回答ありがとうございます。 with closingの処理をTryで囲うのですね。 スッキリしてて良さそうに感じました。 1.個人的にはExceptionはこのレベルではキャッチしない SQLエラー以外の場合は、そのまま上位層に渡して処理すると理解しました。 2.バインドパラメータ サンプルなので記載していませんでしたが、バインドパラメータを利用して インジェクション対応をするように留意いたします。 3.トランザクションの明示 「SQLiteは暗黙のトランザクションがものすごーく遅いので、明示的にトランザクションを開始してください。」とても参考になりました。注意いたします。 4.順序について OrderBy未記載の場合は、保証されないため、必要な場合は明記し取得時の順序を意識するようにします。 5.Mapperについて SQLAlchemyはちょっと触れてみたのですが、使い勝手がそれほど良いとは感じられなかったので、規模的にも今回はsqlite3を利用しようかなと思っています。
umyu

2018/08/08 03:46 編集

@milkteasさんへ 1の部分に関して。 そうですねー。例外の処理方針によると思うのですが、SQLErrorはexceptしても、Exceptionはロジック誤りの可能性があるので、上位に投げたほうがよいのではないかと。こらへんは仕様とか要件だとおもいますー。 あと追記忘れましたが、DBのコネクションを貼る部分sqlite3.connect(dbname)に関しては、接続先がSQLiteから変わっても良いように、関数化しておくのが無難だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問