いももちのきもち

悪戦苦闘の歴史のメモ

csvファイルのデータからsqlite3データベースへうつす、内容の表示

Webサーバ上でデータベースを作ろうと思ったので、まずSQL文の練習をすることにしました。
csvファイルでデータをもらった後、軽量なデータベースであるsqlite3にデータを移しました。
python組み込みのsqlite3モジュールを使用しました。

データの用意

まずサンプルとしてcsvファイルで受注表を用意しました。

jyuchuhyo.csv

受注番号,顧客コード,商品コード,受注個数,納品日
100011,001,1002,30,20110501
100012,002,1001,20,20110501
100013,003,1003,10,20110501
100014,001,1003,15,20110502
100015,003,1101,15,20110503

jyuchuhyo.py

# -*- coding: utf-8 -*-
import csv
import sqlite3

# DBを表すConnectionオブジェクトをRAM上に作成して、DBに接続する。
conn = sqlite3.connect(':memory:')
# DB上の処理対象の行を指し示すためのCursorオブジェクトを作成する。 
cur = conn.cursor()                

# 受注表という名前のtableを作成する。
cur.execute("""CREATE TABLE 受注表
 (受注番号 CHAR(6) NOT NULL,
 顧客コード CHAR(4) NOT NULL,
 商品コード CHAR(5) NOT NULL,
 受注個数 INTEGER NOT NULL,
 納品日 CHAR(8) NOT NULL);""")

# 受注表(csv)を開く。
with open('./sqlite/jyuchuhyo.csv', 'rb') as f: 
    b = csv.reader(f)
    header = next(b)
    for t in b:
        # tableに各行のデータを挿入する。
        cur.execute('INSERT INTO 受注表 VALUES (?,?,?,?,?);', t) 

# 以降、sqlite3のDBからデータの読み出し例
# 受注個数が20より小さいものを3項目(列)表示
cur.execute('SELECT 受注番号, 商品コード, 納品日 FROM 受注表 WHERE 受注個数 < 20;')
for row in cur: # 書き方① for文を使う。
    print row

# 受注表の内容を全部表示
cur.execute('SELECT * FROM 受注表;')
print cur.fetchall()    # 書き方② fetchall()を使う。リストを返す。

# 受注表のうち納品日を重複を排除して表示
cur.execute('SELECT DISTINCT 納品日 FROM 受注表;')
print cur.fetchall()

# DBの変更を保存する。
conn.commit()
# データベースとの接続を閉じる。
conn.close()