やりたいこと
Python3で、PostgreSQLのsequenceを使った処理を書きたい
実行環境
- PostgreSQL9.6.6
- Python3.6
- psycopg2.7.4
検証用シーケンス
CREATE SEQUENCE "schema"."table_name_id_seq" INCREMENT 1 START 1 NO MAXVALUE NO MINVALUE NO CYCLE CACHE 1 OWNED BY "schema"."table_name"."id" ;
実装例
try: conn = psycopg2.connect( host=rds_host, database=rds_database, port=rds_port, user=rds_user, password=rds_password ) except: logger.error("ERROR: Unexpected error: Could not connect to PostgreSQL instance.") sys.exit() with conn.cursor() as cur: id = cur.execute("SELECT NEXTVAL('schema.table_name_id_seq')") print("sequenceの値:" + str(id))
発生したエラー
NG。取得したシーケンスの値がNone
になってしまう。
sequenceの値:None
対処
cur.execute
した後に、cur.fetchone
を使う。
fetchone() クエリの現在行から1行取得し、次の行へ移動。FETCH NEXTに相当。
cur.execute("SELECT NEXTVAL('schema.table_name_id_seq')") id = cur.fetchone() print("sequenceの値:" + str(id))
実行結果は以下の通り。シーケンスの値が取得できるようになった。
sequenceの値:(8,)
参考情報
- Trying to get the next value in sequence from a postgres DB, with django
- PythonとDB: DBIのcursorを理解する
- The cursor class
- Psycopg2の公式ページで調べるのが一番役に立った。