【Python】sqlite3で作成したテーブルにCSVファイルをインポートする

sqlite3 CSVファイル インポート M1

Pythonの標準ライブラリのsqlite3はデータベース環境を提供してくれます。
今回はsqlite3のデータベースにテーブルを作成し、CSVファイルのデータをインポートします。

環境情報

名前バージョン
MacBig Sur 11.2.3
Visual Studio Code1.54.3(Universal)
Python3.9.1
python-pptx0.6.18

今回のCSVデータ

インポートするCSVデータ

sqlite3 データベースの作成

import sqlite3
#test.dbを作成し、接続(すでに存在する場合は接続のみ)
con = sqlite3.connect("test.db")

sqlite3は標準ライブラリのため、pipでのインストールは不要です。
sqlite3.connect("データベース名")でデータベースを作成・接続することができます。
既に同じ名前のデータベースが存在している場合は接続のみ行います。

sqlite3 テーブルの作成

cur = con.cursor()

create_test = "CREATE TABLE IF NOT EXISTS test (id INTEGER, name TEXT, height INTEGER, weight INTEGER)"
cur.execute(create_test)

cursor()オブジェクトはSQLを実行するために必要なオブジェクトです。
execute()で単一のSQLステートメントを実行します。
ここではcreate_test変数に格納したCREATE TABLE文を実行しています。

ちなみにIF NOT EXISTSは
「作成しようとしているテーブルが存在しなければ作成する」ことができるオプションです。

もしこのオプションをつけずに既に同じ名前のテーブルが存在している場合に
CREATE TABLEすると
sqlite3.OperationalError: table テーブル名 already exists
とエラーが返されます。

CSVデータの読み込み

import csv

open_csv = open("test.csv")
read_csv = csv.reader(open_csv)

csvファイルの読み込みはPythonの標準モジュールであるcsvを使用します。
reader()でcsvを読み込み、各行を文字列として返します。

sqlite3 csvデータをexecutemany()でINSERTする

next_row = next(read_csv)

rows = []
for row in read_csv:
    rows.append(row)

cur.executemany(
    "INSERT INTO test (id, name, height, weight) VALUES (?, ?, ?, ?)", rows)

con.commit()
open_csv.close()

next()関数を使用することでCSVファイルの1行目に存在する列名を
スキップさせることができます。
executemany()は複数のSQLステートメントを実行することができます。
INSERTする際のVALUESの値を「?」とすることでリストの各行の要素を
順番に取り出してテーブルに挿入することができます。

sqlite3 テーブルに挿入されたデータの確認

select_test = "SELECT * FROM test"

print(cur.execute(select_test))
print(cur.fetchall())

#こちらでもみれます。

for i in cur.execute(select_test):
    print(i)

sqlite3 SELECT
fetchallとfor文

fetchall()は以前cx_Oracleを紹介した時に実行しているので詳細は以下ご確認ください。

sqlite3 今までのコード全量と少しの追記

import sqlite3
import csv

#test.dbを作成し、接続(すでに存在する場合は接続のみ)
con = sqlite3.connect("test.db")
cur = con.cursor()

#testテーブルを作成(IF NOT EXISTSは「存在しなければ作成する」という意味)
create_test = "CREATE TABLE IF NOT EXISTS test (id INTEGER, name TEXT, height INTEGER, weight INTEGER)"
cur.execute(create_test)

#testテーブルのデータを削除(何回もコード実行すると同じデータ追加されるので)
delete_test = "DELETE FROM TEST"
cur.execute(delete_test)

#csvファイルの指定
open_csv = open("test.csv")

#csvファイルを読み込む
read_csv = csv.reader(open_csv)

#next()関数を用いて最初の行(列名)はスキップさせる
next_row = next(read_csv)

#csvデータをINSERTする
rows = []
for row in read_csv:
    rows.append(row)

#executemany()で複数のINSERTを実行する
cur.executemany(
    "INSERT INTO test (id, name, height, weight) VALUES (?, ?, ?, ?)", rows)

#テーブルの変更内容保存
#csvも閉じておきましょう
con.commit()
open_csv.close()

#testテーブルの確認
select_test = "SELECT * FROM test"

print("----------------------------")
print("fetchall")
print("----------------------------")
print(cur.execute(select_test))
print(cur.fetchall())
print("----------------------------")
print("for文")
print("----------------------------")
for i in cur.execute(select_test):
    print(i)

#データベースの接続終了
con.close

コメント

タイトルとURLをコピーしました