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


参考書籍
[Pythonデータベースプログラミング入門](https://www.amazon.co.jp/Python%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%97%A5%E5%90%91-%E4%BF%8A%E4%BA%8C/dp/4877834621)
日向俊二　著
カットシステム発行
ISBN     978-4-87783-462-3

# ディレクトリ操作
```python:dir.py                                                                                                      
import os
os.chdir("C:\\PythonDB\\ch02")
print(os.getcwd()) 
```                                                                                                                    

# データベース接続
```python: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
```python: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
```python: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
```python: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
```python: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
```python: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
```python: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
```python: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
```python: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
```python:UPDATE.py
import sqlite3
conn = sqlite3.connect("Shop.db", isolation_level=None)
conn.execute("UPDATE Staff SET section='仕入れ' WHERE name='山野健太'")
conn.close()
```

## REPLACE
```python: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
```python:DELETE.py
import sqlite3
conn = sqlite3.connect("Shop.db", isolation_level=None)
conn.execute("DELETE FROM Staff WHERE name='小森浩子'")
conn.close()
```


# CREATE TABLE
```python: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()
```