2017-05-07 13 views
1

Pythonとsqliteの両方に慣れていないので、私は最近両方のことを理解しようとしています。特にsqliteを使って、私はdbにデータをオープン/クローズ/コミットする方法を学びました。しかし、今私は少しをきれいにしようとしているので、関数呼び出しによってdbをオープン/クローズすることができます。関数を使用してsqlite db接続を開いたり閉じたりしますか?

open_db() 
c.execute('SELECT * DO STUFF') 
OR 
c.execute('DELETE * DO OTHER STUFF') 
conn.commit 
close_db() 

私は」:私はプログラムを実行すると、私はクエリまたはテーブルに書き込む前に続いて、私のような何かができる

def open_db(): 
    conn = sqlite3.connect("path) 
    c = conn.cursor() 

def close_db():  
    c.close() 
    conn.close() 

def create_db(): 
    open_db() 
    c.execute("CREATE STUFF") 
    close_db() 

:たとえば、私のような何かをしたいと思いますコンテキストマネージャーについて読んだことがありますが、私はそれらについて何が起こっているか完全に理解していません。コマンドを入力する必要がないので、DB接続を開いたり閉じたりする方法をクリーンアップする最も簡単な方法は何でしょうか。

答えて

1

これは、定義した接続がopen db関数に対してローカルなためです。

def open_db(): 
    conn = sqlite3.connect("path) 
    return conn.cursor() 

、その後

c = open_db() 
c.execute('SELECT * DO STUFF') 

次のように関数を記述することは純粋に学習運動としてOKかもしれないことに留意すべきであるが、一般的に、周りの薄いラッパーを記述するために非常に有用ではないのですが、次のように変更しデータベース接続API

+0

ありがとうございました。 dbを開いたり閉じたりするのに適切な方法は何ですか? – Biggen

+0

私が言っていることは、あなたの関数が本当に有用なことを何もしていないということです。ちょうどそれらを放棄してください。長期的には、PythonデータベースAPIを使用しないことになります。最終的にSQLAlchemyのようなORMを適用したいと思うでしょう。 – e4c5

+0

いいえ、私は理解しています。 ORMを使用してカーソルとconnをグローバルにしたいだけでなく、これを処理する非常に単純な関数を作るのではなく、dbをオープン/クローズするたびに入力する必要がある場合を除きます。 – Biggen

1

私は簡単な方法があるのか​​分かりません。すでに提案したように、データベースカーソルまたは接続の名前を関数のローカルにすると、それらはその関数を終了すると失われます。答えは、contextlibモジュール(Pythonディストリビューションに含まれ、ヘルプファイルに記載されています)を使用してコードを書くことです。私はそれを簡単には呼ぶつもりはない。 sqlite3のドキュメントでは、接続オブジェクトをコンテキストマネージャとして使用することができます。私はあなたがすでにそれに気づいたと思う。私はまた、いくつかの種類のMySQL用のコンテキストマネージャがあることを知っていますが、私はそれを使用していません。

関連する問題