LoginSignup
0
0

More than 1 year has passed since last update.

Pythonデータベースプログラミングを学習したのでまとめ

Last updated at Posted at 2022-09-13

参考書籍
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()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0