参考書籍
Pythonデータベースプログラミング入門
日向俊二 著
カットシステム発行
ISBN 978-4-87783-462-3
ディレクトリ操作
dir.py
import os
os.chdir("C:\\PythonDB\\ch02")
print(os.getcwd())
データベース接続
dbconnect.py
import sqlite3
conn = sqlite3.connect("Cosmos.db", isolation_level=None)
conn = sqlite3.connect(":memory:")
- isolation_level=None を指定することにより自動コミットになる。
指定しない場合はトランザクションコマンドを実行する- conn.commit()
- conn.rollback()
- ファイル名に":memory:"を指定するとファイルを生成せずメモリー上にデータを置く
SELECT
SELECT
SELECT.py
import sqlite3
conn = sqlite3.connect("Cosmos.db", isolation_level=None)
c=conn.cursor()
c.execute("SELECT * FROM Member")
# 列名を取得表示
names = [description[0] for description in c.description]
print(names)
# レコード1件をタプルですべて表示
for row in c:
print(row)
# レコード1件を列インデックスを指定して表示
for row in c:
print(row[0],row[1],row[2],row[3])
conn.close()
- c.descriptionのインデックス0に列名が格納されている
- レコード1件はタプルで表示される
- インデックスを指定することにより個々のフィールドを取得できる
SELECT2
SELECT2.py
import sqlite3
conn = sqlite3.connect("Shop.db")
c=conn.cursor()
c.execute("SELECT * FROM Staff")
for i in range(0,2):
row = c.fetchone()
print(row[0],row[1],row[2])
for row in c.fetchall():
print(row[0],row[1],row[2])
conn.close()
- fetchone()でデータを1件ずつ取得できる
- fetchall()で残りのデータをすべて取得できる
サンプルコードでは最初の2件を一つづつ取得し最後に残りすべてを取得している
SELECT3
SELECT3.py
import sqlite3
conn = sqlite3.connect("Shop.db")
c=conn.cursor()
c.execute("SELECT kosu, kingaku FROM Staff")
for row in c:
print(row[0]*row[1])
conn.close()
- フィールド同士を演算することができる
SELECT4
SELECT4.py
import sqlite3
conn = sqlite3.connect("Shop.db")
c=conn.cursor()
c.execute("SELECT kosu, kingaku FROM Staff")
total=0
for row in c:
total=total+row[0]*row[1]
print(total)
conn.close()
- フィールド同士を演算結果を変数に代入することにより総合計を出すことができる
SELECT5
SELECT5.py
import sqlite3
conn = sqlite3.connect("Shop.db")
c=conn.cursor()
c.execute("SELECT count(*) FROM Staff")
row = c.fetchone()
print(row[0])
conn.close()
- 関数の演算結果は最初のレコードの最初のフィールドに返される
SELECT6
SELECT6.py
import sqlite3
conn = sqlite3.connect("Shop.db")
conn.row_factory = sqlite3.Row
c = conn.execute("SELECT * FROM Staff")
for row in c:
print(row["name"],row["age"],row["section"])
conn.close()
- conn.row_factory = sqlite3.Rowを指定することによりフィールド名を指定できるようになる
INSERT
INSERT1
INSERT1.py
import sqlite3
conn = sqlite3.connect("Sample.db", isolation_level=None)
conn.execute("INSERT INTO Sales VALUES ('2020/12/25','20023',15) ")
conn.close()
INSERT2
INSERT2.py
import sqlite3
conn = sqlite3.connect("Sample.db", isolation_level=None)
sql = "INSERT INTO Fruit VALUES (?,?,?)"
data = [
("20023","バナナ",128),
("21120","温州ミカン",520),
("31010","夏ミカン",120),
("42102","リンゴ",132)
]
conn.executemany(sql, data)
conn.execute(sql, ("52300","イチゴ",880))
- プレースホルダとタプルでデータを一括登録できる
- プレースホルダは1件登録するときも使用できる
UPDATE/REPLACE
UPDATE
UPDATE.py
import sqlite3
conn = sqlite3.connect("Shop.db", isolation_level=None)
conn.execute("UPDATE Staff SET section='仕入れ' WHERE name='山野健太'")
conn.close()
REPLACE
REPLACE.py
import sqlite3
conn = sqlite3.connect("Shop.db", isolation_level=None)
conn.execute("REPLACE INTO Staff(name, age, section) VALUES ('花尾翔','37','販売') ")
conn.close()
- 主キーフィールドの値がDB上に存在する場合はそのレコードを更新する
- 該当レコードがない場合は新規レコードとして追加される
- 主キーフィールドがない場合は新規レコードとして追加される
DELETE
DELETE.py
import sqlite3
conn = sqlite3.connect("Shop.db", isolation_level=None)
conn.execute("DELETE FROM Staff WHERE name='小森浩子'")
conn.close()
CREATE TABLE
CREATE TABLE.py
import sqlite3
conn = sqlite3.connect("auto.db", isolation_level=None)
sql = """
CREATE TABLE IF NOT EXISTS Members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(20),
age INTEGER,
email VARCHAR(128)
);
"""
conn.execute(sql)
conn.execute("INSERT INTO Members(name, age, email) VALUES ('kenta',23,'ken@py.co.ja') ")
conn.execute("INSERT INTO Members VALUES (101,'吉田',44,'Yosshy@cac.cam') ")
conn.close()