見出し画像

PythonでSQLite 備忘録

pythonとSQLite勉強中。個人的なメモです。

わからないところもあるまま書いているので
参考にならないかと思います。。。

SQLiteは動作が軽いらしい。

Mysqlの方が同時接続に強いらしい。

SQLiteでできるようになったこと

テーブルの作成、rowとcolumnの作成。

columnの指定とrowの最終行を指定すること。

セルを指定して書き込み、読み込み

DB Browser for SQLite

DB Browser for SQLiteというフリーのアプリケーションでデータベースを確認しながら作業するとわかりやすかった。

これが使いやすいのでSQLiteを使うことにした。

DB Browser for SQLiteの使い方

データベースがロックされるとき

DB Browser for SQLiteでデータベースを開いて
書き換えなどして保存をしようとしたときに

pythonからもデータベースに書き込みしようとすると

' database is locked 'と言われて怒られる。

データベースファイルをコピーして、コピーで新しくできたファイルを元の名前に変えるとだいたい解決する。

ちょっとハマったこと

time.sleep(n)で止まる。
原因はメインスレッドでループをしていないのに
別スレッドでループをさせたときに起こった。

モジュールを読み込む

import sqlite3

#デフォルトで入っているのでインストールは必要ない。

データベースとその中のテーブルの作成

myDB = '../../datebase/myDB.db'     #ディレクトリを指定
connect_db = sqlite3.connect(myDB)  #これで接続
cur = connect_db.cursor()           #カーソルオブジェクトを作成
cur.execute('CREATE TABLE mytable(id INT,name TEXT, date datetime, price REAL)')

データ型datetimeの意味がわからなかった。

すでに作成済みのデータベースに接続する

myDB = '../../datebase/myDB.db'     #ディレクトリを指定
connect_db = sqlite3.connect(myDB)  #これで接続

SQLiteを操作するカーソルオブジェクトを作成

cur = connect_db.cursor()

テーブルを作成

cur.execute('  CREATE TABLE mytable (id INTEGER ,name TEXT, date datetime)  ')

これでcurで接続されているデータベースのmytableというテーブルを作成して

さらにその中にはid、pair, dateという三つのカラム(列)を作った

それぞれのカラムのデータ型も指定してある。カラムに対してデータ型を指定するの必要はない。

それぞれ INTEGER , TEXT , DATETIME 型になっている、書くときは大文字小文字どちらでも機能する。DATETIME型って使えるのかまだわからない。

データ型

NULL                       :pythonでいうnone
INTEGER    or INT  :pythonでいうint
REAL                  :pythonでいうfloat
TEXT                       :pythonでいうstr
BLOB                       Binary Large OBject。入力データをそのまま格納する。

変数を使った書き込み ? を使う

データベースへの接続と、カーソルオブジェクトの作成までしておく。


hensu = '変数の中身'

cur.execute( "INSERT INTO mytable(id, sample) values(?,?)",[1,hensu])


connect_db.commit() # データベースへコミット。これで変更が反映される。

connect_db.close() # データベースへのコネクションを閉じる。(必須)

mytableというテーブルのidというカラムに1を新規に書き込み、

sampleというカラムに’変数の中身’というTEXTを

hensuという変数を介して新規に書き込む。​

更新する  変数を使って。SQL命令文も変数化。

sql_text = "UPDATE mytable SET hensu = ? where id = ?"  #SQL命令文 
hensu = '変数の中身'       #書き込むデータ1
next_id = 2              #書き込むデータ2

data = (hensu, next_id)  #(書き込むデータ1,書き込むデータ2)

cur.execute(sql_text, data) #命令文()の中に上記の変数ふたつ。sql_text と data



connect_db.commit() # データベースへコミット。これで変更が反映される。

connect_db.close() # データベースへのコネクションを閉じる。

データベースから値を抽出

データベースへの接続と、カーソルオブジェクトの作成までしておく。fetchone()を使用でひとつ取り出した。

取り出すときはcur.fetchone()[0]この形。

なぜ [0] がいるのかわからない。。。

タプルの0番目の指定で、やっと使用できる形になる。

cur.execute( " select カラム名 from テーブル名 where id = 1 ;  ")| #whereで絞り込める  これなしだとタプルでカラムの中身全部の取得になる。(fetchall使用で)

print(cur.fetchone()[0])

# データベースへのコネクションを閉じる。
connect_db.close()

データベースから値を取得 変数を使って

データベースへの接続と、カーソルオブジェクトの作成までしておく。

fetchone()を使用でひとつ取り出した。

取り出すときはcur.fetchone()[0]この形。なぜかはわからない。

タプルの0番目の指定で、やっと使用できる形になった。

なぜ [0] がいるのかわからない。。。

cur.execute( " select カラム名 from テーブル名 where id = ? ;  ")| #whereで絞り込める  これなしだとタプルで全部取得になる。

hensu = 1
cur.execute( " select pair from no1 where id = ? ;  ",[hensu])
print(cur.fetchone()[0])

print(cur.fetchone()[0])

# データベースへのコネクションを閉じる。(必須)
connect_db.close()


コーヒー飲みます。ありがとうございます。