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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

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

Python

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

Q&A

解決済

1回答

1323閲覧

pythonのpsycopg2においてfor文を用いたcursorの使い方としてどちらがよいか?

alfald

総合スコア19

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2022/12/26 07:30

問題点

pythonでデータベースへの接続し、for文でsqlを実行した際にcursorの使い方としてどちらが良いか分かりませんでした。
毎回cursorを開いて閉じた方がいいのか、cursorを上書きしていく方がいいのか、分からないため、よろしければアドバイスを頂けないでしょうか。
コード例を下に示します。

python

1conn=psycopg2.connect(connect) 2def execute_1(sql): 3 with conn: 4 with conn.cursor() as cur: 5 cur.execute(sql) 6 7def execute_2(sql): 8 with conn: 9 cur = conn.cursor() 10 cur.execute(sql) 11 12for i in range(1000000): 13 sql=f"update table set a = {i};" 14 execute_1(sql) 15 execute_2(sql) 16 17conn.close()

アドバイスを頂けると嬉しいです

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

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

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

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

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

guest

回答1

0

ベストアンサー

どちらがいいかというのはどういう基準での話なのかわかりませんが、まず 2 つ目の execute_2() 関数は、cur.close() する必要があると思います。そういう意味では、execute_1() の方がいいと思います。

それとは別に、そもそも for 文をコンテキストマネージャーの中で回した方がいい気がします。

python

1import psycopg2 2 3DSN: str = "path/to/database" 4SQL: str = "update table set a = {};" 5 6conn = psycopg2.connect(DSN) 7 8 9def execute(sql: str): 10 try: 11 with conn: 12 with conn.cursor() as cur: 13 for i in range(1000000): 14 cur.execute(sql.format(i)) 15 finally: 16 conn.close() 17 18 19execute(SQL) 20

個人的には、conn.close() するのも面倒なので、以下のようにするのが好きです。

python

1import psycopg2 2 3DSN: str = "path/to/database" 4SQL: str = "update table set a = {};" 5 6 7def execute(sql: str) -> None: 8 with psycopg2.connect(dsn=DSN) as conn: 9 with conn.cursor() as curs: 10 for i in range(1000000): 11 curs.execute(sql.format(i)) 12 13 14execute(SQL) 15

投稿2022/12/26 13:38

Demerara

総合スコア397

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

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

alfald

2022/12/26 23:47 編集

アドバイスありがとうございます。 コードを簡略化しすぎたため、やりたいことを上手く伝えることができませんでした。 ```https://github.com/mushahiroyuki/python-pro/blob/master/ch06/bark1/database.py``` 上記のサイトの5~17行を参考にコードを作成したため、あのようなコードになってしまいました。 上記のサイトでは、cursorをcloseして無いように感じたため、今回の質問を上げさせてもらいました。
alfald

2022/12/27 04:36

そうだったんですね。 公式ドキュメントの例のコードにはcur.close()がなかったけどconn.closeしてるから省略していて、cursorオブジェクトの中にclose()があったため必要だと思ってました。 お答えいただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問