psycopg2でpostgresSQLにデータ登録

以下の書き方でデータ登録ができました。

#!/usr/bin/env python3
import psycopg2

# assuming
# 1. a postgres service is already active.
# 2. there's a database in postgres, named 'record', belonging to 'user'.
# there's a table named 'name' in it, which has 2 types of data :
# (id SMALLINT PRIMARY KEY, name VARCHAR(100) NOT NULL)

def get_connection():
    return psycopg2.connect(
        host = 'localhost',
        user = 'user',
        password = 'password',
        port = 5432,
        database = 'record'
        )
 
def main():
    raw_data = ( (1, 'Maeda'),
                 (2, 'Yamada'),
                 (3, 'Fujiwara'),
                 (4, 'Takeda'),
                 (5, 'Kato') )
    with get_connection() as conn:
        with conn.cursor() as cur:
            for each_data in raw_data:
                cur.execute('INSERT INTO \
                name(id, name) VALUES (%s, %s);',
                [str(k) for k in each_data])
        conn.commit()

if __name__ == '__main__':
    main()

もしデータが1個の場合は以下のように記述する。

cur.execute('INSERT INTO name(id, name) VALUES (%s, %s);', ('1', 'Maeda',))

もしくは

cur.execute('INSERT INTO name(id, name) VALUES (%s, %s);', ['1', 'Maeda'])

とします。

ポイント

  • VALUES に複数個のデータを渡したいときは、その数の分だけ %sをならべる。
  • VALUES にデータを渡すときには文字列型にする。
  • connection, cursor ともwith構文で書くとcloseは記述不要。

その他

  • ユーザー名・パスワードを直書きしているのは、限られた人しか コードを読まない、という前提です。

環境

  • postgres 11
  • python3.7.3
  • machine: RaspberryPi 3B / buster lite